【问题标题】:Process.Start() fails for *.jpg-FilesProcess.Start() 对于 *.jpg-Files 失败
【发布时间】:2015-02-02 20:20:16
【问题描述】:

我使用以下代码打开jpg-files:

var file = @"C:\Users\administrator.ADSALL4SPS\Desktop\IMG_4121.JPG";
var processStartInfo = new ProcessStartInfo { Verb = "open", FileName = file };
var workDir = Path.GetDirectoryName(file);
if (!string.IsNullOrEmpty(workDir)) {
    processStartInfo.WorkingDirectory = workDir;
}
try {
    Process.Start(processStartInfo);
} catch (Exception e) {
    // Errorhandling
}

现在,当我这样做时,我总是会收到带有NativeErrorCode = ERR_NO_ASSOCIATION 的 Win32Exception

但扩展名 *.jpg 与 MSPaint 相关联。

当我双击文件时,文件会在 MSPaint 中打开。

为什么连文件都关联了Win32Exception

【问题讨论】:

  • 这是一个 Windows 应用程序吗?
  • 是的 - 它是一个 WindowsApplication (.NET 4 with winforms)
  • 你要使用图片框吗?
  • 我想用 default-windows-application(如 MSPaint)打开 jpg 文件。

标签: c# .net windows process process.start


【解决方案1】:

可能 JPG 扩展没有为其注册明确的 open 动词,在这种情况下,您可以省略它,底层的 ShellExecute 函数将使用第一个注册动词(在您的情况下,可能是 edit):

    var processStartInfo = new ProcessStartInfo { FileName = file };

ProcessStartInfo.Verbs 属性包含给定文件名的所有已注册动词。

【讨论】:

    【解决方案2】:

    试试这个:

            string file = @"C:\Users\administrator.ADSALL4SPS\Desktop\IMG_4121.JPG";
            System.Diagnostics.Process.Start(file);
    

    因为你想用默认的windows应用打开这个文件,你需要使用System.Diagnostics.Process.Start用默认的应用打开文件。

    【讨论】:

    • 这看起来与他们在问题中所做的几乎相同,他们只是使用了采用 ProcessStartInfo 而不仅仅是字符串的重载。同样的事情,对吧?
    • @MobyDisk 不,它们是不同的。再次阅读代码,您会发现它们之间的区别。用户尝试使用Verb,但是我根本没有使用它。而这个答案只有两行代码,即使一行也可以编写,所以它更好并且提供了更好的编译时间。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多