2012-10-09 4 views
0

나는 C#에서 wpf 응용 프로그램을 개발 중입니다. 다음 exe 파일을 실행할 수 있습니다..exe를 실행하여 특정 폴더에 출력을 생성하는 방법

public static void GenerateCsvFile(string fileName) 
     { 
      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo.FileName = @"C:\ndfd\degrib\bin\degrib.exe"; 
      startInfo.Arguments = fileName + " -C -msg 1 -Csv"; 
      process.StartInfo = startInfo; 
      process.Start(); 

      System.Diagnostics.Process process1 = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo1 = new System.Diagnostics.ProcessStartInfo(); 
      startInfo1.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo1.FileName = @"C:\ndfd\degrib\bin\degrib.exe"; 
      startInfo1.Arguments = fileName + " -C -msg all -nMet -Csv"; 
      process1.StartInfo = startInfo1; 
      process1.Start(); 
     } 

위의 코드는 나를위한 csv 파일을 성공적으로 생성합니다. 그러나 .csv 파일은 fileName에 따라 다른 위치에 생성됩니다. .csv 파일은 매번 다른 폴더에서 생성된다는 의미입니다. exe 강제로 특정 폴더에 .csv 파일을 생성 할 수 있습니까? 위의 문제를 해결할 수있는 코드 나 링크를 제공해 주시겠습니까?

편집 : 사용자가 zip 파일을 선택하고 양식을 확인합니다. App.ApplicationPath는 하드 코딩 된 경로입니다. 다음은 위의 코드에서

private void ShowPointsButton_Click(object sender, RoutedEventArgs e) 
     { 
      ZipHelper.UnZip(FileNameTextBox.Text, App.ApplicationPath, safeFileName, 9999999); 
} 




public static void UnZip(string SrcFile, string DstFile, string safeFileName, int bufferSize) 
     { 
      //ICSharpCode.SharpZipLib.Zip.UseZip64.Off; 

      FileStream fileStreamIn = new FileStream(SrcFile, FileMode.Open, FileAccess.Read); 

      ZipInputStream zipInStream = new ZipInputStream(fileStreamIn); ; 
      //if (SrcFile.Contains(".bz2")) 
      //{ 
      //BZip2InputStream zipInStream = new BZip2InputStream(fileStreamIn); 
      //} 
      //else 
      //{ 
      // zipInStream = new ZipInputStream(fileStreamIn); 
      //} 


      string rootDirectory = string.Empty; 
      if (safeFileName.Contains(".zip")) 
      { 
       rootDirectory = safeFileName.Replace(".zip", string.Empty); 
      } 
      else 
      { 
       rootDirectory = safeFileName; 
      } 

      Directory.CreateDirectory(App.ApplicationPath + rootDirectory); 

      while (true) 
      { 
       ZipEntry entry = zipInStream.GetNextEntry(); 

       if (entry == null) 
        break; 

       if (entry.Name.Contains("/")) 
       { 
        string[] folders = entry.Name.Split('/'); 

        string lastElement = folders[folders.Length - 1]; 
        var folderList = new List<string>(folders); 
        folderList.RemoveAt(folders.Length - 1); 
        folders = folderList.ToArray(); 

        //string folderPath = ""; 
        //foreach (string str in folders) 
        //{ 
         //folderPath = folderPath + @"\" + str; 
         //string blackslash = folderPath.Substring(0, 1); 

         //if (blackslash == "\\") 
         //{ 
         // folderPath = folderPath.Remove(0, 1); 
         //} 

         //if (!Directory.Exists(App.ApplicationPath + rootDirectory + "/" + folderPath)) 
         //{ 
         // Directory.CreateDirectory(App.ApplicationPath + rootDirectory + "/" + folderPath); 
         //} 
        //} 

        if (!string.IsNullOrEmpty(lastElement)) 
        { 
         //folderPath = folderPath + @"\" + lastElement; 

         //string blackslash = folderPath.Substring(0, 1); 

         //if (blackslash == "\\") 
         //{ 
         // folderPath = folderPath.Remove(0, 1); 
         //} 

         WriteToFile(DstFile + rootDirectory + @"\" + lastElement, bufferSize, zipInStream, rootDirectory, entry); 
        } 

       } 
       else 
       { 
        WriteToFile(DstFile + rootDirectory + @"\" + entry.Name, bufferSize, zipInStream, rootDirectory, entry); 
       } 
      } 

      zipInStream.Close(); 
      fileStreamIn.Close(); 
     } 

private static void WriteToFile(string DstFile, int bufferSize, ZipInputStream zipInStream, string rootDirectory, ZipEntry entry) 
     { 
      WriteFileContents(DstFile, bufferSize, zipInStream); 

      if (DstFile.Contains(".grb")) 
      { 
       Utility.GenerateCsvFile(DstFile); 
      } 

      //if(DstFile.Contains(".csv")) 
      //{ 
      // WriteFileContents(@"D:\Documents" + rootDirectory + @"\" + entry.Name, bufferSize, zipInStream); 
      //} 
     } 

     private static void WriteFileContents(string DstFile, int bufferSize, ZipInputStream zipInStream) 
     { 
      FileStream fileStreamOut = new FileStream(DstFile, FileMode.OpenOrCreate, FileAccess.Write); 
      int size; 
      byte[] buffer = new byte[bufferSize]; 

      do 
      { 
       size = zipInStream.Read(buffer, 0, buffer.Length); 
       fileStreamOut.Write(buffer, 0, size); 
      } while (size > 0); 

      fileStreamOut.Close(); 
     } 

라인 Utility.GenerateCsvFile (DstFile)에서 참조 내 코드입니다; 위치 'DstFile'에서 .csv 파일을 생성하고 싶습니다. 간단히 말해서 .exe 파일에서 .csv 파일을 쓰고 싶을 때 같은 폴더에 파일을 압축 해제하는 폴더입니다. 예를 들어 내 zip 파일의 압축을 풀고있는 D :/XYZ 폴더가 있다고 가정합니다. 이 폴더에는 test.grib 파일이 있습니다. test.grib에 대해 exe를 실행하고 .csv 파일을 생성하려고합니다. 이 .csv 파일을 XYZ 폴더에 쓰길 원합니다.

+0

어떤 DstFile을 의미합니까? 'DstFile' 매개 변수는'UnZip'으로 전달됩니다.이 때'App.ApplicationPath'가됩니다. 이 매개 변수는'WriteToFile'에 전달되기 전에 수정됩니다. 정확히 어디에서 일이 잘못됩니까? –

+0

@ NickW. 모든 것이 잘 작동합니다. 내 문제는 함수입니다 Utility.GenerateCsvFile (DstFile); 위의 코드에서 DstFile은 D : \ Projects \ ApiRouting \ ApiRouting \ Files 경로입니다. 이 경로에서 .exe를 실행 한 후 .csv 파일을 생성해야합니다. 그러나 다른 폴더에서 생성됩니다. –

+0

현재 전달되는 것보다 다른 값의'DstFile'을 해당 메서드에 전달하려고합니다. –

답변

1

processStartInfo.WorkingDirectory = @ "Your Directory";

시도해보십시오.

+0

을 참조하십시오. 어떤 상황이나 묘사가 좋을 것입니다. –

+0

이 접근 방식의 문제점은'fileName' 매개 변수가 절대 경로를 지정한다는 것입니다. 이 경우 작업 디렉토리가별로 효과가 없습니다. –

0

파일 이름이 같은 올바른 디렉토리 및 파일을 가리 키도록해야합니다 C : \ somedir \ mycsvfile.csv

0
string folder = "c:\temp"; 
string fileName = "c:\somedir\blah\file.csv"; 

string outputFilePath = Path.Combine(folder, new FileInfo(fileName).Name); 

당신에게 C의 파일 경로를 얻을 것을 : \ 임시 \의 file.csv을 . 이게 너가 한 일이야?

+0

위의 .exe가 실행되고 .csv 파일이 D :/Docs : D :/Docs 대신 C :/xyz/test에서 .csv 파일을 생성하고 싶습니다. 어떻게 할 수 있습니까? –

+0

D : \ Docs 값은 어디에서 왔습니까? –

+0

startInfo1.FileName에서 오는 값은 무엇입니까? = @ "C : \ ndfd \ degrib \ bin \ degrib.exe"; startInfo1.Arguments = @ "D : \ Documents \ Pacificwind.grb -C -msg 모두 -nMet -Csv" –

관련 문제