vio*_*ite 14 windows linux zip
所以,奇怪的是,我可以解压缩朋友在 Windows 上制作的文件。它发出的东西很奇怪,而且以我以前从未见过的方式不正确。
<base directory stuff>
assets\Changes.txt
assets\DefaultConfig,txt
Run Code Online (Sandbox Code Playgroud)
等等。它显然是一个子目录,但它们作为带有反斜杠的文件出现。
他们在 Windows 上制作它(使用 Compress-Archive powerscript 命令),我尝试在 Linux 上提取它,使用ark来自 KDE的程序和来自 GNOME 的存档管理器。
这里发生了什么?
Kam*_*ski 13
发生这种情况是因为某些 Windows 工具显然使用反斜杠 ( \) 作为分隔符,它们应该使用正斜杠 ( /)。Unix 中的反斜杠可以是文件名或目录名的一部分。
.ZIP 文件格式规范(版本:6.3.5,我写这篇文章时,修订于 2018 年 11 月 20 日)指出:
4.4.17.1 文件名,可选相对路径。存储的路径不得包含驱动器或设备号,或前导斜杠。为了与 Amiga 和 UNIX 文件系统等兼容,所有斜杠必须是正斜杠
/而不是反斜杠\。如果输入来自标准输入,则没有文件名字段。
Microsoft 在文档缓解:ZipArchiveEntry.FullName路径分隔符中提到了此文件:
从面向 .NET Framework 4.6.1 的应用程序开始,
ZipArchiveEntry.FullName属性中使用的路径分隔符已从.NET Framework 早期\版本中使用的反斜杠 ( )更改为正斜杠 (/)。[...]影响
此更改使 .NET 实现符合.ZIP 文件格式规范的第 4.4.17.1 节,并允许在非 Windows 系统上解压缩 .ZIP 档案。
解压缩由在非 Windows 操作系统(如 Macintosh)上针对先前版本 .NET Framework 的应用程序创建的 zip 文件无法保留目录结构。例如,在 Macintosh 上,它创建一组文件,其文件名连接目录路径、任何反斜杠 (
\) 字符和文件名。因此,解压文件的目录结构不会被保留。
请注意,如果归档程序使用了一些旧版本的 .NET Framework,或者它根本不使用它,而是实现了自己的(独立的)zip 文件方法,则可能存在问题。
使用 rar 可能会遇到同样的问题:Unrar 创建的文件在名称中带有反斜杠,而不是正确的目录层次结构。
您可能会发现 Unix & Linux SE 上的这个问题很有帮助:Convert a Windows-created ZIP to Linux (internal paths issue)。我的(有点实验性的)方法是在这个答案中。
这实际上是一个错误Microsoft.PowerShell.Archive:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/48
...这将在此 PR 中解决,版本 1.2.3:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/pull/62
同时,这是一个快速修复(信用):
for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7975 次 |
| 最近记录: |