Zip-папка Windows 10 Documents без включения точек повторной обработки с помощью System.IO.Compression

Я пишу простое настольное приложение для копирования файлов с одного компьютера на другой. Возникли проблемы с точками повторной обработки Windows 10, в частности My Music. Я думал, что сойдет с рук одна простая строка кода:

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

Но это не так, он падает в папке "Моя музыка". Я также попробовал несколько разных способов сделать это, все с тем же результатом - доступ запрещен. Может ли копирование и / или архивирование папки "Документы" быть таким сложным делом? Я сомневаюсь в этом, я просто что-то упускаю. Я пытался повысить привилегии, и это тоже не сработало. У кого-нибудь есть пример, как это сделать?

1 ответ

Решение

Я смог выяснить, как проверить атрибут 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;
    }

Это занимает больше времени, чем я хотел бы запустить - но, глядя на эту чертову проблему в течение нескольких дней, я просто счастлив, что она работает!

Другие вопросы по тегам