2012-10-09 27 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文件嗎?你能否給我提供任何可以解決上述問題的代碼或鏈接?

編輯:用戶選擇壓縮文件並sumbit表單。 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文件路徑:\ TEMP \ 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 all -nMet -Csv」; –

相關問題