【问题标题】:File not found when executable launched from another application从另一个应用程序启动可执行文件时找不到文件
【发布时间】:2011-07-15 15:23:34
【问题描述】:

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

@".\Images\SomeImage.png"

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

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

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

【问题讨论】:

  • 相对路径是什么?应用程序可执行文件?

标签: c# executable relative-path filenotfoundexception


【解决方案1】:

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

通常,您的应用程序将使用工作目录作为可执行文件所在的目录运行 - 例如,这是创建新快捷方式时的默认设置(您可以在“开始于”字段下的快捷方式属性中看到这一点.

当您的应用程序从命令提示符或从另一个应用程序运行时,工作目录会发生变化,并且相对路径会被解析为完全不同的目录。

您可以将调用应用程序更改为将新进程的 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);
}   

【讨论】:

    【解决方案2】:

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

    您发布的路径:

    @".\Images\SomeImage.png"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多