使用 System.IO.Compression 压缩 Windows 10 个不包含重新分析点的文档文件夹

Zip Windows 10 Documents folder without including reparse points using System.IO.Compression

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

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

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

我能够弄清楚如何检查 ReparsePoint 属性,这相对容易,但后来不得不拼凑如何遍历所有文件并将它们添加到 ZipArchive。 RecurseDirectory 归功于

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

    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;
    }

它花费的时间比我想要的要长 运行 - 但是在研究了这个该死的问题几天之后,我很高兴它能起作用!