2017-09-19 17 views
1

我正在写一个简单的桌面应用程序,以将文件从一台PC复制到另一台。无法使用Windows 10重新分析点,特别是我的音乐。我以为会用一行简单的代码逃脱:Zip Windows 10文档文件夹,不包括使用System.IO.Compression重新分析点

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

但并非如此,它在My Music文件夹中崩溃。我也尝试了很多不同的方式来做到这一点,所有结果都一样 - 访问被拒绝。可以复制和/或压缩Documents文件夹真的很难吗?我怀疑它,我只是想念一些东西。我尝试提升特权,但也没有奏效。任何人都有一个如何做到这一点的例子?

+0

doc保存路径在哪里试图保存文件? –

+0

到USB驱动器。或者用户选择的任何位置。 –

回答

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

这需要比我想运行更长的时间 - 但在看了这个dang问题几天之后,我很高兴它的工作原理!