Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

[IO.Compression.ZipFile]::CreateFromDirectory() include directory in archive

I need to compress and extract some zip files with a rather large source, often 30GB or more, so I can’t use the native PowerShell cmdlets. I am looking at using [IO.Compression.ZipFile] static methods, and liking the fact that it works with big source folders, and works faster in general. But I am running into one issue. I want to include the source folder IN the archive, like Compress-Archive does

$sourcePath = '\\px\Rollouts\ADSK\2023\Revit_2023\Deployment\Revit_2023'
Compress-Archive -Path:$sourcePath -DestinationPath:$zipPath 

the Revit_2023 folder is part of the archive, while with

[IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $zipPath)

only the CONTENTS of the Revit_2023 folder is archived. When extracting I could create a folder with the name of the Zip file as the folder name and extract to that, but I can imagine a scenario where I really want the Zip file named differently, perhaps with a date or something. But in looking at the docs here it looks like this behavior is the only option for a simple implementation, and doing what I want to do is going to require managing entries myself. And even that I am not sure about, since it looks like entries are files only? Am I misunderstanding here, and there is an option to include the source folder? I sure would prefer to have a simple solution AND the source folder name in the archive.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Overloads of the method are:

static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)
static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, System.IO.Compression.CompressionLevel compressionLevel, bool includeBaseDirectory)
static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, System.IO.Compression.CompressionLevel compressionLevel, bool includeBaseDirectory, System.Text.Encoding entryNameEncoding)

So the command would be:

[IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $zipPath, [System.IO.Compression.CompressionLevel]::Optimal, $true)

You could pick different CompressionLevel, but you can’t skip it when also using includeBaseDirectory flag.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading