ZipFile.ExtractToDirectory "路径中的非法字符"

Posted

技术标签:

【中文标题】ZipFile.ExtractToDirectory "路径中的非法字符"【英文标题】:ZipFile.ExtractToDirectory "Illegal characters in path" 【发布时间】:2014-05-01 12:31:04 【问题描述】:

我想用 c# (VS2012) 中的 ZipFile 类解压缩一个文件。 即使我直接从 win explorer 复制路径,我也会收到此错误:

System.ArgumentException: Illegales Zeichen im Pfad。北 System.IO.Path.CheckInvalidPathChars(字符串路径,布尔值 checkAdditional) bei System.IO.Path.GetFileName(String path) bei System.IO.Compression.ZipHelper.EndsWithDirChar(String test) bei System.IO.Compression.ZipArchiveEntry.set_FullName(字符串值) 北 System.IO.Compression.ZipArchiveEntry..ctor(ZipArchive 存档, ZipCentralDirectoryFileHeader cd) bei System.IO.Compression.ZipArchive.ReadCentralDirectory() 贝 System.IO.Compression.ZipArchive.get_Entries() 贝 System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName) bei System.IO.Compression.ZipFile.ExtractToDirectory(字符串 sourceArchiveFileName,字符串destinationDirectoryName,编码 entryNameEncoding) bei System.IO.Compression.ZipFile.ExtractToDirectory(字符串 sourceArchiveFileName, String destinationDirectoryName) bei WindowsFormsApplication1.MainForm.buttonStartNxtOSEK_Click(对象 发件人,EventArgs e) 在 d:\C#\nxtOSEKInstaller\nxtOSEKSetup\WindowsFormsApplication1\Form1.cs:Zeile 192.

代码:

string zipPath = @"D:\C#\nxtOSEKInstaller\nxtOSEKSetup\WindowsFormsApplication1\bin\Debug\res\package.zip";
string extractPath = @"D:\testcyginstall\cygwin";

textBoxProgress.AppendText("Entpacke .... ");
try 
    ZipFile.ExtractToDirectory(zipPath, extractPath);
 catch (System.ArgumentException ex) 
    textBoxProgress.AppendText("\n" + "Error\n" + ex.ToString());
    return;


编辑 问题解决: zip 文件中的一些文件名是中文的文件导致了这个问题。 当异常没有输出有问题的路径名时,非常令人沮丧。

【问题讨论】:

我认为 '#' 会出错。尝试更改您的文件夹名称。如果仍然有错误,我们将尝试配置它:) 没有它仍然值得测试,只是为了确保这不是问题。 如果手动解压,文件名是什么? @user2971596 有什么可疑的名字吗? .zip 存档本身包含一个使用保留字符的文件。当问题中出现“cygwin”这个词时,这并不完全是一个谜,Unix 名称规则与 Windows 不同。当然,我们无法帮助您找到文件,祝您好运,挖掘其中的 1000 个文件。获取参考源并使用调试器是取得成功的明显方法。 【参考方案1】:

您已经知道某些字符在 Windows 上无效:

\ / : * ? " |

当您的应用程序从不同的操作系统接收 zip 时,这会带来很多情况,因为其中一些无效字符在其他操作系统中有效。

为了解决这个问题,您可以在提取文件名之前对其进行清理:

public void ExtractZipFileToPath(
        string zipFilePath,
        string ouputPath
        )
    
        using (var zip = ZipFile.Read(zipFilePath))
        
            foreach (var entry in zip.Entries.ToList())
            
                entry.FileName = SanitizeFileName(entry.FileName);
                entry.Extract(ouputPath);
            
        
     

在此处清理示例How to remove illegal characters from path and filenames?

【讨论】:

以上是关于ZipFile.ExtractToDirectory "路径中的非法字符"的主要内容,如果未能解决你的问题,请参考以下文章