2014-02-05 3 views
0

Я пытаюсь закрепить файл с помощью библиотеки DotNetZip. Я читаю путь из файла и сохраняю zip в этот файл. Но программа вылетает и бросает. Это мой код:Доступ запрещен .tmp path

using (ZipFile zip = new ZipFile()) 
{ 
    zip.AddDirectory(dir + "\\OUTPUT_FOLDERS"); 

    StreamReader sr = new StreamReader(dir + "\\Tools\\SettingsForPath"); 
    string path = sr.ReadToEnd(); 
    sr.Close(); 

    zip.Save(path + "\\SavedZip.zip"); 
    Directory.Delete(dir + "\\OUTPUT_FOLDERS", true); 
} 

и вот моя ошибка:

System.UnauthorizedAccessException: Access to the path 'C:\Users\DotNetZip-nvan5kb5.tmp' is denied. 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 
at System.IO.FileStream..ctor(String path, FileMode mode) 
at Ionic.Zip.SharedUtilities.CreateAndOpenUniqueTempFile(String dir, Stream& fs, String& filename) 
at Ionic.Zip.ZipFile.get_WriteStream() 
at Ionic.Zip.ZipFile.Save() 
at Ionic.Zip.ZipFile.Save(String fileName) 

ответ

0

Я думаю, что проблема заключается в каком каталоге ваши временные файлы, созданные у вас нет разрешения. Попробуйте установить временную папку как

zip.TempFileFolder = @"D:\tempfolder"; 

и при использовании сохранить

zip.Save(@"D:\tempfolder\my.zip"); 
+0

Эта папка не может существовать. Фактически, этот диск может не существовать. См. Мой ответ. –

+0

Да. Возможно, поэтому я сказал, что пытаюсь установить известную папку, используя свойство 'TempFileFolder' объекта' ZipFile'. – Sameer

2

Вы пытаетесь написать в каталог C:\Users, и у вас нет разрешения, чтобы сделать это.

Используйте Path.GetTempPath(), чтобы получить имя каталога, в котором вы можете написать.

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx.

Вы могли бы использовать его следующим образом:

using (ZipFile zip = new ZipFile()) 
{ 
    zip.TempFileFolder = System.IO.Path.GetTempPath(); 

    // etc. 
+0

Я не совсем уверен, как и где я должен использовать это. Можете ли вы написать пример? – orglce

+0

@orglce См. Обновленный ответ. –

+1

Он выдает ошибку. Он говорит, что доступ к пути запрещен. – orglce

0

Если пользователь должен действительно иметь доступ на запись попытаться проверить, если у вас есть priviliges запись с помощью кода перед записью на диск .. Использование System.Security.Principal.WindowsIdentity .GetCurrent(). имя для вашего имени .. Если это действительно просто временное использование папки Temp, как указано выше

string path = @"c:\temp"; 
string NtAccountName = @"MyDomain\MyUserOrGroup"; 

DirectoryInfo di = new DirectoryInfo(path); 
DirectorySecurity acl = di.GetAccessControl(AccessControlSections.All); 
AuthorizationRuleCollection rules = acl.GetAccessRules(true, true, typeof(NTAccount)); 

foreach (AuthorizationRule rule in rules) 
{ 
//If we find one that matches the identity we are looking for 
if (rule.IdentityReference.Value.Equals(NtAccountName,StringComparison.CurrentCultureIgnoreCase)) 
    { 
    //Cast to a FileSystemAccessRule to check for access rights 
    if ((((FileSystemAccessRule)rule).FileSystemRights & FileSystemRights.WriteData)>0) 
    { 
     Console.WriteLine(string.Format("{0} has write access to {1}", NtAccountName, path)); 
    } 
    else 
    { 
     Console.WriteLine(string.Format("{0} does not have write access to {1}", NtAccountName, path)); 
    } 
} 
} 
Смежные вопросы