C# 使用System.IO.Compression压缩Windows 10文档文件夹,不包括重新分析点

C# 使用System.IO.Compression压缩Windows 10文档文件夹,不包括重新分析点,c#,system.io.compression,C#,System.io.compression,我正在编写一个简单的桌面应用程序,将文件从一台电脑复制到另一台电脑。Windows 10重分析点有问题,特别是我的音乐。我想我们只需要一行简单的代码: ZipFile.CreateFromDirectory(documentsFolder, docSavePath + @"\Documents.zip", CompressionLevel.Optimal, false); 但事实并非如此,它会在“我的音乐”文件夹中崩溃。我也尝试了很多不同的方法,都有相同的结果——拒绝访问。复制和/或压缩文档文

我正在编写一个简单的桌面应用程序,将文件从一台电脑复制到另一台电脑。Windows 10重分析点有问题,特别是我的音乐。我想我们只需要一行简单的代码:

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

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

我能够找到如何检查repassepoint属性,这相对简单,但随后必须拼凑出如何循环所有文件并将它们添加到ZipArchive。递归目录的功劳归于

然后我加入了我所了解的关于重分析文件属性的内容

    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;
    }
private void documentBackup(字符串docSavePath)
{
如果(File.Exists(docSavePath+@“\Documents.zip”))File.Delete(docSavePath+@“\Documents.zip”);
使用(ZipArchive docZip=ZipFile.Open(docSavePath+“\\Documents.zip”,ZipArchiveMode.Create))
{
foreach(递归目录中的FileInfo goodFile(documentsFolder))
{
var destination=Path.Combine(goodFile.DirectoryName,goodFile.Name).Substring(documentsFolder.ToString().Length+1);
docZip.CreateEntryFromFile(Path.Combine(goodFile.Directory.ToString(),goodFile.Name),目标);
}
}
}
公共IEnumerable RecurseDirectory(字符串路径,列表currentData=null)
{
如果(currentData==null)
currentData=新列表();
var directory=newdirectoryinfo(路径);
foreach(目录.GetFiles()中的var文件)
currentData.Add(文件);
foreach(directory.GetDirectories()中的变量d)
{
if((d.Attributes&FileAttributes.repassepoint)=FileAttributes.repassepoint)
{
继续;
}
其他的
{
递归目录(d.FullName,currentData);
}
}
返回当前数据;
}

这比我想跑的时间要长,但在看了这该死的问题几天后,我很高兴它能工作

我能够找到如何检查ReparsePoint属性,这相对简单,但随后必须拼凑出如何循环遍历所有文件并将它们添加到ZipArchive中。递归目录的功劳归于

然后我加入了我所了解的关于重分析文件属性的内容

    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;
    }
private void documentBackup(字符串docSavePath)
{
如果(File.Exists(docSavePath+@“\Documents.zip”))File.Delete(docSavePath+@“\Documents.zip”);
使用(ZipArchive docZip=ZipFile.Open(docSavePath+“\\Documents.zip”,ZipArchiveMode.Create))
{
foreach(递归目录中的FileInfo goodFile(documentsFolder))
{
var destination=Path.Combine(goodFile.DirectoryName,goodFile.Name).Substring(documentsFolder.ToString().Length+1);
docZip.CreateEntryFromFile(Path.Combine(goodFile.Directory.ToString(),goodFile.Name),目标);
}
}
}
公共IEnumerable RecurseDirectory(字符串路径,列表currentData=null)
{
如果(currentData==null)
currentData=新列表();
var directory=newdirectoryinfo(路径);
foreach(目录.GetFiles()中的var文件)
currentData.Add(文件);
foreach(directory.GetDirectories()中的变量d)
{
if((d.Attributes&FileAttributes.repassepoint)=FileAttributes.repassepoint)
{
继续;
}
其他的
{
递归目录(d.FullName,currentData);
}
}
返回当前数据;
}

这比我想跑的时间要长,但在看了这该死的问题几天后,我很高兴它能工作

试图将文件保存到usb驱动器的文档保存路径在哪里。或者用户选择的任何位置。文档保存路径试图将文件保存到哪里?到usb驱动器。或者用户选择的任何位置。