Zip файлы без включения папок - PullRequest
0 голосов
/ 27 ноября 2018

Я использую System.IO.Compression для сжатия файла в .zip, ниже исходного кода:

using (FileStream zipToOpen = new FileStream(zipName, FileMode.CreateNew)){
  using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)){
    ZipArchiveEntry readmeEntry = archive.CreateEntry(@"C:\Users\soc\myFold\someFile.xml");
  }
}

Этот фрагмент кода работает хорошо, но, к сожалению, в .zipесть вся последовательность папок (C: -> Users -> ... -> someFile.xml);я могу получить окончательный .zip ТОЛЬКО файл, который мне нужен?Я знаю, что с другими библиотеками это возможно ( DotNetZip добавляет файлы без создания папок ), но я хотел бы знать, возможно ли сделать то же самое со стандартной библиотекой.

1 Ответ

0 голосов
/ 27 ноября 2018

Похоже, у вас сложилось впечатление, что файл будет добавлен в архив, что не соответствует действительности.CreateEntry просто создает запись с указанным путем и именем записи, вам все равно нужно написать фактический файл.
На самом деле, код в вашем вопросе очень похож на код в документацииИтак, я предполагаю, что вы получили его оттуда?

В любом случае, чтобы получить только имя файла, вы можете использовать Path.GetFileName, а затем вы можете записать фактическое содержимое файла в zip-запись.

var filePath = @"C:\temp\foo.txt";
var zipName = @"C:\temp\foo.zip";

using (FileStream zipToOpen = new FileStream(zipName, FileMode.CreateNew))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry(Path.GetFileName(filePath));
        using (StreamReader reader = new StreamReader(filePath))
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
        {
            writer.Write(reader.ReadToEnd());
        }
    }
}

Приведенный выше код создаст архив с foo.txt в корне и содержимым исходного файла без каких-либо дополнительных каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...