创建一个没有位于其中的原始目录的 Zip

Posted

技术标签:

【中文标题】创建一个没有位于其中的原始目录的 Zip【英文标题】:Create A Zip without the original directory located within 【发布时间】:2014-04-15 14:45:39 【问题描述】:

我正在尝试从一个目录创建一个 zip,该目录直接包含源目录的内容,而不是源目录的内容,然后将内容上传到 Azure。

所以我有 C:\temp\aFolder,使用 Write-Zip PSCXE 从中创建一个 zip

write-zip c:\temp\test c:\temp\test2.zip

或 Create-7zip 函数

function create-7zip([String] $aDirectory, [String] $aZipfile)
    [string]$pathToZipExe = "C:\Program Files (x86)\7-zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
   & $pathToZipExe $arguments;


create-7zip "c:\temp\test" "c:\temp\test.zip"

这两种方式都将创建一个 ZIP 存档,其中包含源目录。

所以它将是:TEST.ZIP -> TEST -> myContent。

我想要的是:TEST.ZIP -> myContent。这可能吗?我在这方面找不到任何东西。

非常感谢任何想法/帮助。

编辑:因为我无法回答自己的问题

我的天啊。 @MJOLNIR 再次救了我,我刚刚在另一篇文章中找到了他的答案。我道歉。

答案是使用(如果您安装了 .NET 4.5)

$src = "c:\temp\test"
$dst = "c:\temp\test3.zip"
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
[System.IO.Compression.ZipFile]::CreateFromDirectory($src, $dst)

将生成 TEST.ZIP -> 内容。

【问题讨论】:

【参考方案1】:

请注意,在 .Net Framework 4.5 之前,不支持 ZipFile 类。

不过,实际上既不需要最新最好的框架,也不需要外部工具。像这样的东西也应该起作用:

$folder  = 'C:\temp\test'
$zipfile = 'C:\path\to\your.zip'

# create the zip file
$b = 'P', 'K', 5, 6 | %  [char]$_ 
$b += 1..18 | %  [char]0 
[IO.File]::WriteAllBytes($zipfile, [byte[]]$b)

$app = New-Object -COM 'Shell.Application'

$src = $app.NameSpace($folder)
$dst = $app.NameSpace($zipfile)

# copy items from source folder to zip file
$dst.CopyHere($src.Items())

# wait for copying to complete
do 
  Start-Sleep -Milliseconds 200
 until ($src.Items().Count -eq $dst.Items().Count)

【讨论】:

非常酷!幸运的是,我可以在我的服务器上使用 4.5 框架,这是我的脚本将运行的地方,但如果(很可能是何时)我需要在以前实现的框架上执行这样的任务,我肯定会记住这一点。在我看来,在 PS 中创建 ZIP 并不是一项简单的任务(至少对于像我这样不知道如何创建您提供的代码的新手来说不是这样,因为我几乎无法解释它) 前 4 个字节 (PK..) 定义了一个 zip 文件。其他 18 个零字节只是将文件大小增加到所需的最小 22 个字节。

以上是关于创建一个没有位于其中的原始目录的 Zip的主要内容,如果未能解决你的问题,请参考以下文章

java.util.zip - 重新创建目录结构

如何使用 python 从位于同一目录中的多个 zip 文件夹中读取 csv 文件?

如何将 zip 文件的内容分配给 Spark 中的每个任务?

从文档目录中的文件夹创建 ZIP 文件 - Objective C (ARC)

Android Studio创建buildSrc目录,并在其中写gradle打包apk等文件生成zip

git clone和download zip的区别