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;
}
Это занимает больше времени, чем я хотел бы запустить - но, глядя на эту чертову проблему в течение нескольких дней, я просто счастлив, что она работает!