В доступе отказано исключение при использовании 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);