Подтвердить что ты не робот

С# ZipFile.CreateFromDirectory - процесс не может получить доступ к файлу "path_to_the_zip_file_created.zip", потому что он используется другим процессом

Основной код:

string startPath = @"C:\intel\logs";
string zipPath = @"C:\intel\logs-" + DateTime.Now.ToString("yyyy_dd_M-HH_mm_ss") + ".zip";
ZipFile.CreateFromDirectory(startPath, zipPath);

Ошибка: процесс не может получить доступ к файлу "path_to_the_zip_file_created.zip", потому что он используется другим процессом.

Упомянутая выше настройка отлично работает в Windows 7, где у меня установлена ​​Visual Studio, но при запуске на Windows Server 2008R2 я получил вышеприведенное сообщение об ошибке.

Я проверил журналы антивируса, и он не блокирует приложение, и он не блокирует созданный zip файл.

4b9b3361

Ответ 1

//WRONG
ZipFile.CreateFromDirectory("C:\somefolder", "C:\somefolder\somefile.zip");
//RIGHT     
ZipFile.CreateFromDirectory("C:\somefolder", "C:\someotherfolder\somefile.zip");

Я использую одну и ту же ошибку: архивирование файла в ту же папку, что и я, zip.
Это вызывает ошибку, конечно.

Ответ 2

У меня была такая же проблема. Обходной путь заключается в том, чтобы скопировать папку, в которую вы клонируете в другую папку, и указать там CreateFromDirectory. Не спрашивайте меня, почему это работает, но это так.

Directory.CreateDirectory(<new directory path>);
File.Copy(<copy contents into new folder>);
ZipFile.CreateFromDirectory(<new folder path>, <zipPath>);

Ответ 3

Другие ответы дают правильную причину, но у меня была небольшая проблема в понимании их с первого взгляда. Я не могу комментировать, поэтому ставим это как ответ. Может быть легко для тех, кто посещает это позже.

Если путь к создаваемому Zip файлу совпадает с тем, который указан в ZipFile.CreateFromDirectory, ZipFile создает нужный zip файл и начинает добавлять файлы из каталога в него. И в конце концов, попробуйте добавить нужный zip файл и в zip файл, так как он находится в том же каталоге. Это просто невозможно и не требуется, потому что нужный zip файл используется методом CreateFromDirectory.

Ответ 4

Я столкнулся с этим в то время, потому что я пытался заархивировать папку, где мои файлы журнала активно записывались работающим приложением. Ответ Кайла Джонсона может сработать, но он добавляет накладные расходы на копирование папки и необходимость очистки копии после этого. Вот некоторый код, который создаст zip файл, даже если в него записываются файлы журнала:

void SafelyCreateZipFromDirectory(string sourceDirectoryName, string zipFilePath)
{
    using (FileStream zipToOpen = new FileStream(zipFilePath, FileMode.Create))
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
    {
        foreach (var file in Directory.GetFiles(sourceDirectoryName, "*", SearchOption.AllDirectories))
        {
            var entryName = file.Substring(sourceDirectoryName.Length).TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar});
            var entry = archive.CreateEntry(entryName);
            entry.LastWriteTime = File.GetLastWriteTime(file);
            using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (var stream = entry.Open())
            {
                fs.CopyTo(stream, 81920);
            }
        }
    }
}

Ответ 5

Если вы получаете эту ошибку, потому что NLog блокирует ваши файлы журналов, вы можете использовать следующий обходной путь. Добавьте атрибут keepFileOpen в тег nlog внутри NLog.config и установите для него значение false:

<nlog xmlns=.......
   keepFileOpen="false"
....>

Подробнее здесь.

Обратите внимание, что этот параметр будет иметь отрицательную производительность при ведении журнала NLog, как указано здесь.