Сжимать пустые папки как папки, а не файлы

#powershell #compression #system

#powershell #сжатие #система

Вопрос:

Я использую System.IO.Compression.Файловая система для сжатия папки с вложенными папками в сценарии powershell. Некоторые папки пусты, и вместо пустых папок создаются пустые файлы. Я думал, что это ошибка, но они указывают это в своей документации:

Структура каталогов из файловой системы сохраняется в архиве. Если каталог пуст, создается пустой архив. Используйте этот метод перегрузки, чтобы указать уровень сжатия и включать ли базовый каталог в архив.

Знаете ли вы, как этого избежать, я хочу, чтобы пустые папки были как папки… Это кажется смешным…

Редактировать:

 $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($Source, $Target, $compressionLevel, $true)
  

Комментарии:

1. Хммм … Я не уверен, правильно ли я вас понял. Если вы что-то сжимаете — неважно, что это такое, — результатом будет архивный ФАЙЛ, например archive.zip например. И если вы сожмете пустую папку, эта пустая папка окажется в таком файле архива. Рассматривали ли вы возможность использования встроенного командлета Compress-Archive ?

2. Не могли бы вы, пожалуйста, включить фрагмент того, как именно вы выполняете сжатие? Это поможет нам протестировать и устранить неполадки вместе с вами.

3. @root готово, это так просто, я думал, что в этом нет необходимости.

Ответ №1:

Для меня это работает просто отлично, если я добавляю ссылку на System.IO.Compression.FileSystem.dll :

 Add-Type -Path 'C:WindowsMicrosoft.NetassemblyGAC_MSILSystem.IO.Compression.FileSystemv4.0_4.0.0.0__b77a5c561934e089System.IO.Compression.FileSystem.dll'

# compress using just two parameters. 
# This will omit the source folder and gives you no option to set the CompressionLevel
[System.IO.Compression.ZipFile]::CreateFromDirectory("D:Testzip", "D:result.zip")
  

Если вы также хотите включить исходный файл, используйте функцию с 4 параметрами:

 [System.IO.Compression.ZipFile]::CreateFromDirectory("D:Testzip", "D:result.zip", "Fastest", $true)
  

Смотрите Перечисление уровня сжатия

Для тестирования я использовал структуру папок, в которой пуста только подпапка D:Testzipfolder1folder1-1 :

 D:TESTZIP
|   the only file in the root directory.txt
|
---folder1
     ---folder1-1
    ---folder1-2
            just a single file here.txt
  

result.zip Файл впоследствии содержал пустую папку просто отлично..

Комментарии:

1. Это хорошее компромиссное решение, но мне нужен оптимальный уровень. В противном случае файл будет слишком тяжелым.

2. @toscanelli Вот почему я добавил ссылку на уровень сжатия . Просто измените "Fastest" на "Optimal"

3. Ах, извините, я понял, что хитрость заключалась в снижении уровня сжатия. Я вижу, вы добавляете ссылку вручную. Я добавил без полного пути (Add-Type -Assembly System.IO.Compression. Файловая система), потому что я не буду знать, на какой ОС будет запущен (Windows наверняка, но не знаю версию …). Я все равно попробую.

4. Это здорово, но вы можете упростить AddType до Add-Type -AssemblyName System.IO.Compression.FileSystem