【问题标题】:ZipFile.ExtractToDirectory throwing on long filenameZipFile.ExtractToDirectory 抛出长文件名
【发布时间】:2018-08-17 01:49:56
【问题描述】:

我正在解压这样的 zip 文件

ZipFile.ExtractToDirectory(zipFile, extractTo);

但我得到了一个

{"Could not find a part of the path 'C:\\....many subfolders\\Extremely long filename'."}

该 zip 文件包含一个具有很长路径和文件名 c.a 的文件。总共 280 个字符。我不确定这是否是我启用长路径的问题,如此处所示https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

如果我在资源管理器中打开路径,它会打开,但没有长文件名的文件。如果我打开 zip 文件,文件就在那里,所以提取文件名长的文件似乎有问题。

是否可以在 zip 提取过程中跳过文件或允许提取具有长文件名的文件?

【问题讨论】:

  • ZipFile.OpenRead
  • 请注意,跳过文件是一件非常危险的事情,尤其是如果您不告诉用户您已经这样做了。
  • 嗨@DavidG 是的,我完全同意。如果可以提取所有文件,那将是最好的。为什么没有提取文件的任何线索为什么抛出错误?

标签: c# .net io zipfile


【解决方案1】:
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.Length > 280)
            continue;

        entry.ExtractToFile(Path.Combine("your path", entry.FullName));
    }
} 

ZipFile.OpenRead 将允许您检查 zip 文件的内容。然后您可以通过.Entries 属性进行枚举以找出存档中的所有文件,并根据文件名长度决定是否要继续提取。

【讨论】:

  • @CamiloTerevinto 我认为代码足够自我解释。如果名称太长,则跳过文件,如果与问题中描述的不符,则继续提取
  • 感谢@Steve 的解决方案。当然,如果所有文件都可以提取出来,那将是最好的。任何线索为什么没有提取长名称的文件? ZipFile 存档有限制吗?
  • @doorman Windows 有限制(260 个字符),您无法绕过。
  • 即使我允许?也许我需要重新启动? blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/…
  • 为什么这被标记为解决方案?我遇到了同样的问题,我不能跳过提取文件,也不能控制压缩目录的命名方式。应该有一个实际的解决方案,而不是“跳过它”。
【解决方案2】:

如果您使用的是基于 Windows 的文件系统,则文件名的最大长度为 255 个字符。注意:计算文件名长度时,文件夹路径包含在文件名中。如果您的文件夹路径很长,那么您可能想尝试解压到 c:\temp,它只使用 7 个字符。因此,您可以使用 248 个字符。如果您的文件名比存档中的文件名长,您可能希望首先解决该问题,这样您就不必从提取中排除文件。

https://msdn.microsoft.com/en-us/library/windows/desktop/ee681827(v=vs.85).aspx

http://www.ntfs.com/ntfs_vs_fat.htm

Maximum filename length in NTFS (Windows XP and Windows Vista)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2022-06-21
    • 2016-05-27
    • 2021-08-14
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多