- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 System.IO.Compression 提取一些 Zip 文件的内容。问题是,只要有一个文件名包含某些 Windows 非法字符的条目,就会抛出异常。我已经尝试了几件事,但我仍然没有找到任何方法来忽略错误的条目并提取好的条目。请考虑修改 zip 文件的内容对于我们正在执行的处理类型来说是不可能的,因此我必须按原样处理文件。
系统通常处理具有多个条目的文件,这个数目是可变的,但在一个 zip 文件中最多可以有 300 个条目,偶尔会有一个文件名为 'myfile<name>.txt'
的条目。 , 其中包含的尖括号对于 Windows 来说显然是非法字符。我真的想忽略这个条目并继续提取 ZipArchive 中的其余条目。但看起来这是不可能的。
关于如何忽略 ZipArchive 的错误条目有什么想法吗?
到目前为止,我已经尝试了不同的方法来分别获取条目,但我总是遇到完全相同的异常错误。
以下是我到目前为止尝试过的一些事情:
实现迭代条目的常规方法:
foreach (ZipArchiveEntry entry in ZipArchive.Entries)
试图通过索引只获取一个条目(这里有同样的异常,即使第一个条目是有效的):
ZipArchiveEntry entry = ZipArchive.Entries[0]
使用 lambda 表达式应用过滤器以忽略无效条目(也有相同的异常(exception)):
var entries = zipArchive.Entries.Where(a =>
a.FullName.IndexOfAny(Path.GetInvalidFileNameChars() ) == -1);
这些都没有帮助,我每次得到的异常如下:
at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) at System.IO.Path.GetFileName(String path) at System.IO.Compression.ZipHelper.EndsWithDirChar(String test) at System.IO.Compression.ZipArchiveEntry.set_FullName(String value) at System.IO.Compression.ZipArchiveEntry..ctor(ZipArchive archive, ZipCentralDirectoryFileHeader cd) at System.IO.Compression.ZipArchive.ReadCentralDirectory() at System.IO.Compression.ZipArchive.get_Entries() at ZipLibraryConsole.MicrosoftExtraction.RecursiveExtract(Stream fileToExtract, Int32 maxDepthLevel, Attachment att) in C:\Users\myUser\Documents\Visual Studio 2015\Projects\ZipLibraryConsole\ZipLibraryConsole\MicrosoftExtraction.cs:line 47
这是已实现代码的片段:
var zipArchive = new ZipArchive(fileToExtract, ZipArchiveMode.Read);
try
{
foreach (var zipEntry in zipArchive.Entries) // the exception is thrown here, there is no chance to process valid entries at all
{
// Do something and extract the file
}
catch (ArgumentException exception)
{
Console.WriteLine(
String.Format("Failed to complete the extraction. At least one path contains invalid characters for the Operating System: {0}{1}", att.Name, att.Extention));
}
最佳答案
使用 System.Reflection 您至少可以隐藏错误,尽管您只能获得路径包含非法字符的条目。
添加此类并使用 archive.GetRawEntries() 而不是 archive.Entries
public static class ZipArchiveHelper
{
private static FieldInfo _Entries;
private static MethodInfo _EnsureDirRead;
static ZipArchiveHelper()
{
_Entries = typeof(ZipArchive).GetField("_entries", BindingFlags.NonPublic | BindingFlags.Instance);
_EnsureDirRead = typeof(ZipArchive).GetMethod("EnsureCentralDirectoryRead", BindingFlags.NonPublic | BindingFlags.Instance);
}
public static List<ZipArchiveEntry> GetRawEntries(this ZipArchive archive)
{
try { _EnsureDirRead.Invoke(archive, null); } catch { }
return (List<ZipArchiveEntry>)_Entries.GetValue(archive);
}
}
try-catch 很丑陋,如果它让您感到厌烦,您可以捕获特定的异常。根据上面的评论,这是在 .NET Core 中修复的。 (更新:已确认此问题已在 .Net Core 3.1 中修复,可能更早)。
此(部分)修正归功于 https://www.codeproject.com/Tips/1007398/Avoid-Illegal-Characters-in-Path-error-in-ZipArchi和 https://gist.github.com/rdavisau/b66df9c99a4b11c5ceff
关于修复带有非法字符的路径(不仅仅是 zip 文件)的更多指示在 ZipFile.ExtractToDirectory "Illegal characters in path"
关于c# - 当其中一个包含非法字符时,如何获取 ZipArchive 的有效条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42262013/
我已经编写了如下方法将多个 Memorystream 绑定(bind)到 ziparchive。该代码适用于一个流,但如果我通过迭代添加多个流,则它会在 for 循环的第二行显示以下错误。 Syst
我刚刚通过 composer 下载了 PhpSpreadsheet 包,我试图生成一个 Excel 电子表格。但我得到的只是一个错误“ Class ZipArchive not found ”。我在
我目前将大量照片存储在 LAMP 服务器上的 zip 存档中。当新用户添加到我的程序时,我打开 zip 存档并添加他们的照片。 问题是当 zip 存档接近 50MB 时,函数 ZipArchive::
我需要解压缩上传的内容。但是为了安全起见,必须验证这些文件只是图像文件,这样就无法将 php 添加到 zip 中,然后再运行它。 在进行解压缩时,我还需要保留文件结构。 $zip->extractTo
我正在使用 php ZipArchive,但遇到了一个简单的问题。 我需要创建新文件,如果存在同名的文件,我需要覆盖它。 我的问题是,如果我使用此代码 if ($zip->open($packageF
我已经包括了libz.1.2.3.dylib 插入代码后 ZipArchive* za = [[ZipArchive alloc] init]; 编译时出错 "_OBJC_CLASS_$_ZipAr
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我的方法接受一个列表并创建一个 ZIP 文件和一个日志文件。它适用于较小数量的文件。但是当我获取大量文件(测试了 11,000 个)时,它会引发 SystemOutOfMemory 异常。 通过研究,
我在处理程序中使用 ZipArchive 来为使用内存流和 Web 处理程序的用户提供服务。在我将应用程序上传到实时站点之前,这在本地一直有效。 这是我的代码。 using (ZipArchive n
我正在编写桌面 WPF 应用程序 (.Net Framework 4.5),其中一项任务是将多个文件保存到 zip 存档。我做了2种方法。首先创建 zip,其次从中读取。 public sta
当使用 ZipArchive 解压缩包时,它似乎阻塞了主线程。 zip 文件中大约有 283 个文件。我把它放在后台线程上,但它似乎没有帮助。 dispatch_async(dispatch_get_
我将使用 PHP 类创建一个 Zip 存档。但它仍然无法正常工作。它不会失败,响应是 1。他没有创建 Zip 文件。 $zip = new ZipArchive; $res = $zip->open(
所以我有一些代码可以捕获屏幕并将其保存到 jpeg 文件中。这工作正常,但是我想将 jpeg 编码的捕获保存到新的 ZipArchive,而不是先将位图写入文件系统。 这是我目前所拥有的: FileI
我可以使用相对路径压缩文件吗? 例如: $zip->addFile('c:/wamp/www/foo/file.txt'); ZIP 应具有如下目录结构: foo -> file.txt 而不是:
我正在使用 php ZipArchive 类来生成 zip 存档。我使用 addFile 方法的第二个参数来设置存档中文件的名称(因为磁盘上的真实文件具有不同的名称)。某些名称必须包含法国口音(例如
我有一个简单的 Zip 创建脚本,可将加载的文件复制到单个目录中,然后从该目录创建一个 .zip 文件。这种方法听起来很简单,但是它产生的文件在打开时有问题。 起初我很困惑,因为文件可以在 7Zip、
我刚开始尝试编写一些 PHP 代码以在 EC2 服务器上的 Linux 机器上运行,它将从我的 S3 存储桶中读取文件,压缩它们,然后将 zip 文件写回存储桶。 即使从 EC2 实例的本地磁盘上的一
我正在尝试修复一些图像的自动压缩脚本中的问题,这是我不久前编写的,并且一直有效到现在。一切似乎都很好,直到 $zip->close(); 给出以下内容: Warning: ZipArchive::
我正在尝试使用一些字节数组数据动态创建一个 zip 流,并通过我的 MVC 操作下载它。 但是下载的文件在windows中打开时总是出现以下损坏的错误。 当我尝试从 7z xtract 时出现此错误
我一直有 - 我认为权限问题 - 解压缩文件(这部分没问题)并将内容移动到写入文件夹。 我正在运行简单的代码: $zip = new ZipArchive( ); $x = $zip->ope
我是一名优秀的程序员,十分优秀!