web-dev-qa-db-ja.com

関連するアプリケーションでファイルを開く

関連するアプリでC#アプリからファイルを開く際に助けを求めたいです。私はこれを試しました:

_      ProcessStartInfo pi = new ProcessStartInfo(file);
      pi.Arguments = Path.GetFileName(file);
      pi.UseShellExecute = true;
      pi.WorkingDirectory = Path.GetDirectoryName(file);
      pi.FileName = file;
      pi.Verb = "OPEN";
      Process.Start(pi);
_

またはこれ:

_      Process.Start(file);
_

両方の例の文字列fileは、開こうとしているファイルへのフルパスを表します。現在、ACDSeeアプリでの(jpg)画像を除くすべてが正常に機能しています。 Irfanviewアソシエーションは、MSオフィス文書でもうまく機能します。 acdseeに関連付けられたjpgイメージを開こうとすると、通知領域でacdseeが実行されるだけで、ファイルは開きません。

レジストリでCLASSES_ROOTに* .jpg画像があり、関連するアプリとしてACDSee.JPG値があり、このキーの下にShell-> Open->コマンドパス:

_"C:\Program Files\ACD Systems\ACDSee\ACDSee.exe" /dde
_

そして、私はこの奇妙な_/dde_が理由であり、ファイルを開くことができない理由です。同じregキーにShell-> Open[open("%1")]を持つDDEExecキーエントリがあることに気付きました

Irfanビューまたはその他のチェック済みアプリの場合、ddeexecはなく、次のような通常のコマンドだけがあります。

_"C:\Program Files (x86)\IrfanView\i_view32.exe" "%1"
_

ファイル名の%1を交換した後、コマンドラインから実行できます、しかし、コマンドラインのacdseeエントリからコマンドを実行できませんでした:(

だから私の質問は、どのようにProcessStartInfoオブジェクトをすべてのファイルを実行することを保証するに設定することができますか?ダブルクリック、エクスプローラー、標準およびこのDDEExecもの?私が知っておくべきDDEExecのような他のものはありますか? EN、ありがとうございます

57
Zavael

書くだけ

System.Diagnostics.Process.Start(@"file path");

System.Diagnostics.Process.Start(@"C:\foo.jpg");
System.Diagnostics.Process.Start(@"C:\foo.doc");
System.Diagnostics.Process.Start(@"C:\foo.dxf");
...

また、シェルは、通常のダブルクリックと同様に、レジストリからそれを読み取って関連プログラムを実行します。

106
Tigran

これは古いスレッドですが、万が一私がしたように誰かがそれに出くわした場合に備えて。 pi.FileNameは、ファイルを開くために使用する実行可能ファイルのファイル名(および場合によってはfileへのフルパス)に設定する必要があります。以下のコードは、VLCでビデオファイルを開くのに役立ちます。

var path = files[currentIndex].fileName;
var pi = new ProcessStartInfo(path)
{
    Arguments = Path.GetFileName(path),
    UseShellExecute = true,
    WorkingDirectory = Path.GetDirectoryName(path),
    FileName = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe",
    Verb = "OPEN"
};
Process.Start(pi)

Tigranの答えは機能しますが、Windowsのデフォルトアプリケーションを使用してファイルを開くため、デフォルトではないアプリケーションでファイルを開きたい場合はProcessStartInfoを使用すると便利です。

15
Tree

。Net Core(v2.2以降)では次のようになります。

new Process
{
    StartInfo = new ProcessStartInfo(@"file path")
    {
        UseShellExecute = true
    }
}.Start();

関連するgithubの問題を見つけることができます here

3
Mehdi Dehghani