使用 System.IO.Compression 压缩 Windows 10 Documents 文件夹,不包括重解析点

Posted

技术标签:

【中文标题】使用 System.IO.Compression 压缩 Windows 10 Documents 文件夹,不包括重解析点【英文标题】:Zip Windows 10 Documents folder without including reparse points using System.IO.Compression 【发布时间】:2018-02-28 14:01:17 【问题描述】:

我正在编写一个简单的桌面应用程序来将文件从一台 PC 复制到另一台 PC。 Windows 10 重新分析点有问题,特别是我的音乐。我以为只需要一行简单的代码就可以逃脱:

ZipFile.CreateFromDirectory(documentsFolder, docSavePath + @"\Documents.zip", CompressionLevel.Optimal, false);

但并非如此,它会在“我的音乐”文件夹中崩溃。我也尝试了很多不同的方法,结果都是一样的——访问被拒绝。复制和/或压缩 Documents 文件夹真的这么难吗?我对此表示怀疑,我只是错过了一些东西。我尝试提升权限,但也没有用。任何人都有如何做到这一点的例子?

【问题讨论】:

试图保存文件的文档保存路径在哪里? 到 USB 驱动器。或者用户选择的任何位置。 【参考方案1】:

我能够弄清楚如何检查 ReparsePoint 属性,这相对容易,但随后必须拼凑出如何遍历所有文件并将它们添加到 ZipArchive。 RecurseDirectory 的功劳归于this answer。

然后我添加了我学到的关于重解析文件属性的内容。

    private void documentBackup(string docSavePath)
    
        if (File.Exists(docSavePath + @"\Documents.zip")) File.Delete(docSavePath + @"\Documents.zip");
        using (ZipArchive docZip = ZipFile.Open(docSavePath + "\\Documents.zip", ZipArchiveMode.Create))
        
            foreach (FileInfo goodFile in RecurseDirectory(documentsFolder))
            
               var destination = Path.Combine(goodFile.DirectoryName, goodFile.Name).Substring(documentsFolder.ToString().Length + 1);
               docZip.CreateEntryFromFile(Path.Combine(goodFile.Directory.ToString(), goodFile.Name), destination);                    
            
        
    


    public IEnumerable<FileInfo> RecurseDirectory(string path, List<FileInfo> currentData = null)
    
        if (currentData == null)
            currentData = new List<FileInfo>();

        var directory = new DirectoryInfo(path);

        foreach (var file in directory.GetFiles())
            currentData.Add(file);

        foreach (var d in directory.GetDirectories())
        
            if ((d.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint)
            
                continue;
            
            else
            
                RecurseDirectory(d.FullName, currentData);
            
        

        return currentData;
    

它需要的时间比我想运行的要长 - 但是在看了几天这个该死的问题之后,我很高兴它可以工作!

【讨论】:

以上是关于使用 System.IO.Compression 压缩 Windows 10 Documents 文件夹,不包括重解析点的主要内容,如果未能解决你的问题,请参考以下文章

使用 vb.net 和 System.IO.Compression (.Net 4.5) 压缩文件

我没有在“System.IO.Compression”命名空间中找到“ZipFile”类

System.IO.Compression.ZipFile.CreateFromDirectory - 在 Mac 上打开时没有文件夹结构

使用 System.IO.Compression 压缩 Windows 10 Documents 文件夹,不包括重解析点

ZipFile (System.IO.Compression)、c# (WPF) 的字符提取问题

使用System.IO.Compression在内存中创建ZIP存档