доступ запрещен при попытке извлечь архив из временной папки пользователя Windows

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

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

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


person Hanan    schedule 03.11.2008    source источник


Ответы (2)


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

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

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

string dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
person Marc Gravell    schedule 03.11.2008
comment
благодаря. оказалось длинным путем-именем. включение пути решает его. другой способ создать имя временного каталога: do { folderName = Path.GetRandomFileName(); path = Path.Combine(Path.GetTempPath(), имя_папки); } пока (Directory.Exists(путь)); - person Hanan; 03.11.2008

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

Решение этой проблемы можно найти здесь:

стандартный способ преобразования в короткий путь в .net

person Hanan    schedule 03.11.2008