web-dev-qa-db-ja.com

Process.Start()を使用してフォルダーを開くと、アクセスが例外として拒否されます

特定のフォルダーを開かなければならないC#のwinformsアプリケーションがあります。私が使う

_System.Diagnostics.Process.Start(pathToFolder);
_

これにより、次の例外が発生します。

System.ComponentModel.Win32Exception(0x80004005):アクセスが拒否されました

system.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)で

system.Diagnostics.Process.Start()で

system.Diagnostics.Process.Start(ProcessStartInfo startInfo)で

myApp.openLogFolderToolStripMenuItem_Click(オブジェクト送信者、EventArgs e)で

私はすでに次のことを確認しました:

  • フォルダが存在します
  • ユーザーはフォルダーに対する権限を持っています(エクスプローラーで開くことができます)

もう1つは、Process.Start()を使用してこのフォルダー内のファイルを開くと、機能することです。

誰かが私にヒントを与えることができますか?
乾杯

編集私の目標はエクスプローラーでフォルダーを開くことです。 pathToFolderは_H:\Something\App.Name\Log_のようなものです

5
IRAndreas

MSDNによると( https://msdn.Microsoft.com/en-us/library/53ezey2s(v = vs.110).aspxSystem.Diagnostics.Process.Start(string)はファイルを実行するか、プロセス(したがって、フォルダを開きません)。フォルダを開く場合、 https://msdn.Microsoft.com/en-us/library/h6ak8zt5(v = vs.110).aspx は、System.Diagnostics.Process.Start(string, string)ここで、最初はExplorer、Total commanderなどへの道であり、2番目は使用するExplorerに何をすべきかを指示する引数である必要があります(フォルダーpathToFolderを開きます)。

一部のシステム変数には「デフォルトのフォルダビューア」の値が格納されていると思いますが、どこにあるのかわかりません。私はそれのために行き、後で答えを持って戻るようにします。

それがお役に立てば幸いです。


EDIT:ちょっと掘り下げてフォルダを開くと、次のようになります。

System.Diagnostics.Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\Explorer.exe", pathToFolder);

ここで、最初の引数は従来のWindowsエクスプローラーへのパスであり、2番目の引数はフォルダー自体への実際のパスです。未亡人はそれ自体では他の「フォルダビューア」(Total Commanderなど)へのパスを保持していないようです。したがって、この方法はおそらくテーブルから外れています。

4
Rao

私は通常これを使用してファイル/ディレクトリを開きます:

    public static void OpenFile(string path, bool isDirectory = false)
    {
        if (string.IsNullOrEmpty(path)) return;
        if ((isDirectory && Directory.Exists(path)) || (!isDirectory && File.Exists(path)))
        {
            ProcessStartInfo pi = new ProcessStartInfo(path);
            pi.Arguments = Path.GetFileName(path);
            pi.UseShellExecute = true;
            pi.WindowStyle = ProcessWindowStyle.Normal;
            pi.Verb = "OPEN";

            Process proc = new Process();
            proc.StartInfo = pi;

            proc.Start();
        }
    } 

または

Process.Start("Explorer.exe",path);

これが機能しない場合は、結局のところ許可の問題である可能性があります。

0
Arie

このように作業ディレクトリを設定することはできますが、ディレクトリ自体を実行することはできません。ファイルまたはexeのみです。

var startInfo = new ProcessStartInfo();

startInfo.WorkingDirectory = //作業ディレクトリ

プロセスproc = Process.Start(startInfo);

0
lyz

これを試して:

var psi = new System.Diagnostics.ProcessStartInfo() { FileName = pathToFolder, UseShellExecute = true };
System.Diagnostics.Process.Start(psi);
0
arkhivania