Zip Windows 10 Documents文件夹,不使用System.IO.Compression包含重新分析点

时间:2017-09-19 17:16:06

标签: c# system.io.compression

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

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

但不是这样,它在My Music文件夹中崩溃了。我也尝试了很多不同的方法,所有这些都有相同的结果 - 拒绝访问。复制和/或压缩Documents文件夹真的很难吗?我对此表示怀疑,我只是遗漏了一些东西。我尝试提升特权,但也没有用。任何人都有一个如何做到这一点的例子?

1 个答案:

答案 0 :(得分:0)

我能够弄清楚如何检查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;
    }

这比我想跑的时间要长 - 但是看了几天这个问题之后,我很开心它的确有效!

相关问题