【问题标题】:How to generate output in specific folder by running .exe如何通过运行 .exe 在特定文件夹中生成输出
【发布时间】:2012-09-29 10:55:28
【问题描述】:

我正在用 C# 开发 wpf 应用程序。我能够运行以下 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 文件会根据文件名在不同的位置生成。意味着 .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 文件的同一文件夹中。例如,考虑有一个 D:/XYZ 文件夹,我在其中解压缩我的 zip 文件。在这个文件夹中有 test.grib 文件。我想为 test.grib 运行 exe 并生成 .csv 文件。我希望将这些 .csv 文件写入 XYZ 文件夹。

【问题讨论】:

  • 你是指哪个DstFileDstFile 参数被传递到UnZip,此时它将是App.ApplicationPath。然后在传递到WriteToFile 之前修改此参数。到底哪里出了问题?
  • @NickW。一切对我来说都很好。我的问题仅在于功能 Utility.GenerateCsvFile(DstFile);在上面的代码中,DstFile 是路径 - D:\Projects\ApiRouting\ApiRouting\Files。在这条路径上,我希望在运行 .exe 后生成我的 .csv。但它是在另一个文件夹中生成的
  • 那么问题是您想向该方法传递与当前传递的值不同的DstFile 值吗?
  • 没有。假设我的 grib 文件位于位置 D:\Projects\ApiRouting\ApiRouting\Files\abc.grb 那么所有 .csv 文件必须在 D:\Projects\ApiRouting\ApiRouting\Files 文件夹中生成,而不是在之后的任何其他文件夹中运行exe
  • 目前正在生成 D:/Documents 中的 .csv 文件

标签: c# wpf exe system.diagnostics


【解决方案1】:

文件名需要指向正确的目录和文件,如c:\somedir\mycsvfile.csv

【讨论】:

    【解决方案2】:
    string folder = "c:\temp";
    string fileName = "c:\somedir\blah\file.csv";
    
    string outputFilePath = Path.Combine(folder, new FileInfo(fileName).Name);
    

    这应该会为您提供 c:\temp\file.csv 的文件路径。这就是你所追求的吗?

    【讨论】:

    • 上述.exe运行并在D:/Docs中生成.csv文件。我想在 C:/xyz/test 中生成 .csv 文件,而不是 D:/Docs。我该怎么做?
    • D:\Docs 值从何而来?
    • 它来自 startInfo1.FileName = @"C:\ndfd\degrib\bin\degrib.exe"; startInfo1.Arguments = @"D:\Documents\Pacificwind.grb -C -msg all -nMet -Csv";
    • D:/Docs 在我的第一条评论中表示 D:/Documents
    • 好吧,你应该能够为此调整我的示例代码。如果您想完全控制文件写入的文件夹,请考虑将附加参数传递到您的 GenerateCsvFile 以指定文件夹。在这种情况下,您的 startInfo1.Arguments 可能是 Path.Combine(outputFolder, "Pacificwind.grb") + "-C -msg all -nMet -Csv"
    【解决方案3】:

    processStartInfo.WorkingDirectory = @"你的目录";

    请试试这个。

    【讨论】:

    • 这是做什么的?一些上下文或描述会很好。
    • 我认为这种方法的问题在于fileName参数指定了一个绝对路径。在这种情况下,工作目录不会有太大影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2012-03-21
    相关资源
    最近更新 更多