В доступе отказано исключение при использовании Process.Start() для открытия папки

У меня есть приложение winforms в C#, где я должен открыть определенную папку. я использую

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)

Я уже проверил следующие вещи:

  • Папка существует
  • Пользователь имеет права на папку (может открыть ее в Проводнике)

Другое дело, что если я использую Process.Start() чтобы открыть файл внутри этой папки, все работает.

Кто-нибудь может дать мне подсказку?
ура

Изменить Моя цель - открыть папку в Проводнике. pathToFolder это что-то вроде H:\Something\App.Name\Log

7 ответов

Решение

Согласно MSDN ( https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx) System.Diagnostics.Process.Start(string) запускает файл или процесс (и, следовательно, не открывает папку). Для открытия папки https://msdn.microsoft.com/en-us/library/h6ak8zt5(v=vs.110).aspx предлагает, что вы можете сделать это с System.Diagnostics.Process.Start(string, string) где first должен быть способом для проводника, Total Commander или чем-то подобным, а второй должен быть аргументом, указывающим используемому проводнику что делать (откройте папку pathToFolder).

Я предполагаю, что какая-то системная переменная хранит значение для "средства просмотра папок по умолчанию", но я не знаю, где. Я постараюсь пойти на это и вернусь позже с ответом.

Надеюсь, что это поможет.


РЕДАКТИРОВАТЬ: я сделал несколько быстрых копаний и, чтобы открыть папку, следующее должно сделать трюк:

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

Где первый аргумент - это путь к классическому проводнику Windows, а второй - фактический путь к самой папке. Кажется, что вдовы сами по себе не хранят путь к другому "средству просмотра папок" (например, Total Commander и т. Д.), Поэтому этот способ, вероятно, находится вне таблицы.

Попробуй это:

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

Я обычно использую это, чтобы открыть файл / каталог:

    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);

Если это не работает, это может быть проблема разрешения в конце концов.

Очень важно установить рабочий каталог перед запуском процесса.

      Directory.SetCurrentDirectory("BackUp");
Process.Start("BackUp/MyApp.exe");

Если вы этого не сделаете, BackUp/MyApp.exe будет действовать так, как будто текущий каталог — это каталог, из которого вы запускаете Process.Start("BackUp/MyApp.exe"). И это может вызвать описанную выше проблему, если ваш код в запущенном вами процессе пытается сделать что-то не в той папке.

Вы можете установить рабочий каталог, как это, но вы не можете запустить сам каталог только файлы или EXE

var startInfo = new ProcessStartInfo ();

startInfo.WorkingDirectory = // рабочий каталог

Process proc = Process.Start(startInfo);

Эта ошибка действительно происходит, когда есть разница между поведением открытия файла по умолчанию и относительным поведением открытия файла. Например, если вы выбрали приложение по умолчанию для открытия файлов.pdf как Internet Explorer, и вы пытаетесь открыть тот же файл с помощью метода Process.Start(). Вы получите исключение, потому что в соответствии с операциями по умолчанию он должен открыть этот файл в Internet Explorer, и ваше приложение пытается открыть его с помощью Adobe Reader.

Чтобы исправить это, установите приложение по умолчанию для файла.pdf как Adobe Reader, и вы больше не получите эту ошибку. Вы можете сделать это, щелкнув правой кнопкой мыши по файлу и выбрав "Программа по умолчанию" или "Приложение". Кроме того, выберите программу или приложение по умолчанию из списка доступных программ, а затем выберите Всегда использовать выбранную программу / приложение для открытия файлов этого типа.

Если это гиперссылка для ASP.NET, вы можете использовать альтернативу

Response.Redirect(url);
Другие вопросы по тегам