2008-11-03 7 views
0

Я пытаюсь запустить процесс командной строки (который является извлечением. .7z-архива) в файл, который находится во временной папке в пользовательской временной области Windows каталог (C: \ Documents and Settings \ User \ Local Settings \ Temp), используя Process в моем приложении C#.доступ запрещен, пытаясь извлечь архив в папку временных файлов Windows

Я думаю, что процесс возвращает ошибку, которая происходит из-за «доступа отказано», потому что я могу увидеть win32Exception с кодом ошибки 5, когда я копаю в объекте prcoess .NET.

делать то же самое в каком-то другом месте, работало нормально раньше, так что, возможно, это то, что я не должен делать? (запуск процесса для использования файла в% TEMP%) Возможно, мне нужно как-то передать безопасность?

ответ

1

Предполагая, что вы используете обычный .NET (не CF/Silverlight и т. Д.). Ожидается доступ к файлам в области темпа пользователя. Интересно, не проблема в том, что вы случайно оставили файл открытым после его создания, возможно, не используя «использование» или подобное?

Я, вероятно, не предлагаю использовать переменные среды (% TEMP% и т. Д.) При обходе отдельного процесса; в идеале вы передали бы полный путь к файлу (меньше вещей, чтобы ошибиться ...), убедившись, что цитата любые аргументы пути (в случае пробела) - то есть ваши аргументы @ "..." " c: \ some path \ whatever \ tmp "" ... "(если вы понимаете, что я имею в виду).

Наконец, если вы извлекаете файлы, вам нужно подумать о существующем содержимом. Path.GetTempFileName() отлично подходит для создания одного файла местоблюститель, но для извлечения архива вы, вероятно, хотите создать каталог - GUID, удобен для этого purpoes (в то время как avioding конфликтов, и не забудьте удалить его впоследствии):

string dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); 
+0

спасибо. оказалось длинным путем. . Ограждающих путь в "решает эту проблему другой способ создания имени каталога Темп это сделать { FOLDERNAME = Path.GetRandomFileName(); путь = Path.Combine (Path.GetTempPath(), FOLDERNAME); } while (Directory.Exists (путь)); – Hanan

0

, выполняющий тот же процесс с использованием командной строки (cmd), помог мне разобраться, моя проблема заключалась в том, что я указал аргументы пути процессу с использованием long-path-name.

Решение это можно найти здесь:

standard way to convert to short path in .net