Destinaton Каталог заархивированного файла:
@"C:\temp\logfiles\[Some Name]\Zip"
входит в путь к исходному каталогу, базовый каталог для операции сжатия:
@"C:\temp\logfiles\[Some Name]
.
ZipFile.CreateFromDirectory включает в себя древовидную структуру SubDirectories базового каталога и его содержимое при создании сжатого файла, поэтому он пытается также сжать целевой файл, который он создает. Конечно, он не может получить к нему доступ, потому что он (угадайте, что) используется.
Если вы переместите каталог назначения за пределы базового пути, он не вызовет никаких исключений.
Вы можете использовать каталог User Temp
в качестве временного пункта назначения для zip-файла, а затем переместить его в каталог назначения по завершении.
Пользовательский временный каталог возвращается Environment.GetEnvironmentVariable () :
Environment.GetEnvironmentVariable("Temp", EnvironmentVariableTarget.User);
Вам также необходимо удалить zip-файл Temp и в любом случае убедиться, что он еще не существует (файл с таким именем может быть там по любой причине, и попытка перезаписать его приведет к ошибке).
Пример возможного метода создания ZipFile с использованием пользовательского временного каталога:
string SourceFolder = @"C:\temp\logfiles\";
string DestinationFolder = @"C:\temp\logfiles\Zip";
string ZippedFileName = "ZippedFile.zip";
string UserTempFolder = Environment.GetEnvironmentVariable("Temp", EnvironmentVariableTarget.User);
string ZippedTempFile = Path.Combine(UserTempFolder, ZippedFileName);
if (File.Exists(ZippedTempFile)) { File.Delete(ZippedTempFile); }
ZipFile.CreateFromDirectory(SourceFolder, ZippedTempFile);
Directory.CreateDirectory(DestinationFolder);
File.Move(ZippedTempFile, Path.Combine(DestinationFolder, ZippedFileName));