2

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

@".\Images\SomeImage.png"

当应用程序直接启动时它工作正常,但如果您尝试通过另一个应用程序运行它:

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

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

4

2 回答 2

3

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

您发布的路径:

@".\Images\SomeImage.png"

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

于 2011-07-15T15:27:21.973 回答
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);
}   
于 2011-07-15T15:28:34.060 回答