1

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

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

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

4

1 回答 1

0

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

它需要的时间比我想运行的要长 - 但是在看了几天这个问题之后,我很高兴它有效!

于 2017-09-20T17:32:23.263 回答