从其他应用程序启动可执行文件时找不到文件

时间:2011-07-15 15:23:35

标签: c# executable relative-path filenotfoundexception

在我的应用程序中,在用户登录后,我设置了一些图片框/按钮/等图像并对它们做了一些缩放等等。我使用相对路径,例如:

@".\Images\SomeImage.png"

直接启动应用程序时它可以正常工作,但如果您尝试通过其他应用程序运行它:

Process process = new Process();
process.StartInfo.FileName = networkPath;
process.Start();

它死了并且找到了一个找不到文件的错误,因为它找不到图像。如果我尝试通过命令提示符启动它,它也会这样做。可执行文件存储在网络驱动器上。为什么相对路径在这种情况下不起作用?我可以继续前进并硬编码完整的路径,但这让我觉得很脏......有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您需要将Process.WorkingDirectory属性设置为正确的路径。

您发布的路径:

@".\Images\SomeImage.png"

不是网络路径(它不是UNC或使用映射驱动器)。

答案 1 :(得分:3)

这是因为工作目录不同 - 默认情况下,在启动新进程时,新进程的工作目录将设置为现有进程的工作目录(这可能是包含现有应用程序的目录)内)。

通常,您的应用程序将以工作目录作为包含可执行文件的目录运行 - 这是创建新快捷方式时的默认设置(您可以在“开始”字段下的快捷方式属性中看到此信息)

当您从命令提示符或其他应用程序运行应用程序时,工作目录会更改,相对路径将解析为完全不同的目录。

您可以将调用应用程序更改为将新进程的WorkingDirectory属性设置为它所期望的值,但是修复它的正确方法是修改应用程序,以便它使用基于可执行文件的路径。 Assembly.GetExecutingAssembly().Location可用于获取正在运行的可执行文件的路径,因此以下代码应该可以解决这个问题:

static string GetAbsolutePathFromRelative(string RelativePath)
{
    string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string absolutePath = Path.Combine(directory, RelativePath);
    // This final call is to stop paths like "C:\Dir\..\OtherDir\file.txt" being returned
    return Path.GetFullPath(absolutePath);
}