在Microsoft Surface应用程序中使用相对路径?

时间:2010-12-29 13:42:41

标签: c# .net wpf pixelsense

我通过以下代码将我的wave文件转换为mp3文件:

internal bool convertToMp3()
        {
            string lameEXE = @"C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\lame\lame.exe";
            string lameArgs = "-V2";

            string wavFile = fileName;
            string mp3File = fileName.Replace("wav", "mp3");

            Process process = new Process();
            process.StartInfo = new ProcessStartInfo();
            process.StartInfo.FileName = lameEXE;
            process.StartInfo.Arguments = string.Format("{0} {1} {2}", lameArgs, wavFile, mp3File);

            process.Start();
            process.WaitForExit();

            int exitCode = process.ExitCode;
            if (exitCode == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

这可行,但现在我不想使用绝对路径到lame.exe但是相对路径。我在项目根目录的/ lame /文件夹中包含了一个lame.exe。我该如何参考呢?

3 个答案:

答案 0 :(得分:1)

假设您的二进制应用程序位于Debug文件夹中,而lame文件夹位于主项目目录中:

string lameEXE = @"..\..\lame\lame.exe

Hovewer,您的发布版本中的文件夹结构可能会有所不同。

答案 1 :(得分:1)

如果您有权使用您的应用程序分发文件,那么一种方法是将.exe文件作为项目包含在C#项目中,

Build Action = None
Copy to Output Directory = Copy if newer

然后您可以使用

string lameEXE = @"lame.exe"

答案 2 :(得分:1)

直接使用相对于应用程序目录的路径是个坏主意,因为工作目录可能与应用程序目录不同。这可能会导致错误和安全漏洞。例如,您可以在不受信任的目录中执行文件。

工作目录与应用程序目录不同的一些情况:

  • 用户从资源管理器中打开文件。然后工作目录是文件所在的目录
  • 根据设置通用对话框(OpenFileDialog,SaveFileDialog)更改工作目录。

所以你应该相对于项目目录展开它。不幸的是,我知道没有干净的库函数可以帮到你。在简单的情况下,这可以通过连接应用程序目录的相对路径来完成:

string appDir = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]) + "\\";
const string relativePath=@"..\..\lame.exe";//Whatever relative path you want
string absolutePath=appDir+relativePath;

...
process.StartInfo.FileName =absolutePath;
...