【问题标题】:System.Diagnostics.Process.Start problem "Can not find specific file"System.Diagnostics.Process.Start 问题“找不到特定文件”
【发布时间】:2010-02-15 14:42:10
【问题描述】:

当我在我的计算机上启动以下代码时,它工作正常

string target = e.Link.LinkData as string;
target = System.IO.Directory.GetCurrentDirectory() + target;
System.Diagnostics.Process.Start(target);

target - 文件的非绝对路径。文件存在。 在清除虚拟机异常“找不到特定文件”时产生。

有什么建议吗?
更新
我强调在我的电脑上工作正常。 为什么它不能在另一台计算机上运行

【问题讨论】:

  • 仔细记录你得到的异常。如果是 Win32Exception,我们需要知道其 NativeErrorCode 属性的值。

标签: c#


【解决方案1】:

切勿使用+ 运算符连接路径。请改用Path.Combine()。这也可能是问题的根源。

【讨论】:

    【解决方案2】:

    我会做的第一件事是尝试找出问题的根源,即验证失败时报告的确切路径。

    将您的代码修改为这样的内容(请注意,我已切换到使用另一张海报提到的 Path.Combine):

    string target = e.Link.LinkData as string;
    target = Path.Combine(System.IO.Directory.GetCurrentDirectory() + target);
    var fileInfo = new FileInfo(target);
    if (!fileInfo.Exists)
    {
        throw new FileNotFoundException("The requested file was not found: " + fileInfo.FullName);
    }
    System.Diagnostics.Process.Start(target);
    

    在失败的系统上运行它。完全合格的路径真的是您所期望的吗?

    如果没有 - 你已经找到原因了。

    如果是,则开始调查权限等问题。执行此操作的用户是否有权访问或执行该文件或其所在的文件夹?

    发回任何进展...

    【讨论】:

      【解决方案3】:

      GetCurrentDirectory() 不会在其返回路径的末尾添加“\”字符。如果你这样做,你需要自己添加它。

      【讨论】:

      • 在这种情况下,您输入的斜线位于目标变量中。
      【解决方案4】:

      可能缺少 DLL?尝试在Dependency Walker 中加载 EXE 以查看它是否产生任何错误(在您的虚拟机上)。

      此外,Process.Start 的 MSDN 页面指出,如果 PATH 环境变量包含包含引号的字符串,则 ProcessStart 可以抛出 FileNotFoundException。

      【讨论】:

      • 抛出的异常不是 FileNotFoundException 而是 Win32Exception
      【解决方案5】:

      使用 procmon 查看它试图打开的文件,正如已经指出的,使用 Path.Combine 连接您的路径。

      可能是您在另一台机器上存在权限问题,而您的开发机器上没有?

      【讨论】:

      • 权限问题不合适。在虚拟机管理员用户运行应用程序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多