В настоящее время я пишу программу на C#, которая скопирует все файлы профиля пользователя на внешнее устройство (в данном случае на мой домашний сервер).C# File Permissions
Когда мой код выполняет итерацию через мои файлы и папки, он выдает UnauthorizedAccessException
.
У меня есть Googled это и искал StackOverflow, но я не могу найти четкое решение, которое не связано с завершением моего процесса. Идея состоит в том, что она должна копировать файлы и папки, имеющие разрешения на чтение.
У меня было это, когда я только начинал, но я легко исправил его, ограничив, какие каталоги я бы сделал резервным (хотя я бы предпочел полную резервную копию).
Вот мой код:
FileInfo f = new FileInfo(_configuration.Destination);
if (!f.Directory.Exists)
{
f.Directory.Create();
}
string[] backupDirectories = new string[]
{
"Desktop",
"Documents",
"Downloads",
"Favorites",
"Links",
"Pictures",
"Saved Games",
"Searches",
"Videos",
".git",
".android",
".IdealC15",
".nuget",
".oracle_jre_usage",
".vs",
"Contacts"
};
foreach (string dirPath in backupDirectories)
{
DirectoryInfo dirInfo = new DirectoryInfo(_path + "\\" + dirPath);
if (dirInfo.Exists)
{
foreach (string dirP in Directory.GetDirectories(dirInfo.FullName, "*", SearchOption.AllDirectories))
{
DirectoryInfo dirI = new DirectoryInfo(dirP);
if (dirI.Exists)
{
string dir = dirP.Replace(_path, _configuration.Destination);
try
{
Directory.CreateDirectory(dir);
textBox2.Invoke((MethodInvoker) delegate
{
textBox2.AppendText("Create Directory: " + dir + Environment.NewLine);
});
} catch (Exception e)
{
textBox2.Invoke((MethodInvoker) delegate
{
textBox2.AppendText("Could NOT Create Directory: " + dir + Environment.NewLine);
});
continue;
}
foreach (FileInfo theFile in dirInfo.GetFiles("*", SearchOption.AllDirectories))
{
string newPath = theFile.FullName;
string file = newPath.Replace(_path, _configuration.Destination);
try
{
File.Copy(newPath, file, true);
textBox2.Invoke((MethodInvoker) delegate
{
textBox2.AppendText("Create File: " + file + Environment.NewLine);
});
} catch (Exception ex)
{
textBox2.Invoke((MethodInvoker) delegate
{
textBox2.AppendText("Could NOT Create File: " + file + Environment.NewLine);
});
}
}
}
}
}
}
Я извиняюсь, если код грязный, но я буду описывать то, что он делает. Первый бит проверяет, существует ли резервная папка на внешнем диске.
Вторая часть говорит, какие папки мне нужно сделать резервными (если вы можете исправить это и сделать резервную копию всех каталогов с разрешениями, пожалуйста, помогите мне в этом).
Первый цикл запускает итерацию для каждого из backupDirectories
. Второй цикл запускает итерацию для каждой из каталогов в каталоге резервного копирования. Третий цикл запускает итерацию для каждой из папок в каталоге резервного копирования.
Исключение составляет Directory.GetDirectories(dirInfo.FullName, "*", SearchOption.AllDirectories)
, и оно пытается получить доступ к C:\Users\MyName\Documents\My Music
. Попытка доступа к нему в проводнике дает мне ошибку разрешений, хотя она не указана в проводнике при попытке перейти к «Документам» (я в Windows 10 Pro).
Попробуйте предоставить разрешения сетевой службы для этой папки.Щелкните правой кнопкой мыши папку пользователя и перейдите к безопасности. – Kami
В настоящее время моя учетная запись «Администраторы» и «СИСТЕМА» имеют только полный доступ к моему каталогу в «C: \ Users». Не уверен, что делать с «My Music». Также обратите внимание, что 'Моя музыка' отделена от' Music'. – SysVoid
Если ваш код выдает исключение, потому что он недоступен, я не думаю, что вы можете что-то сделать, поскольку полномочия на код не превышают операционную систему. Но две вещи, которые вы можете сделать на стороне кода: (1) Проверьте 'Directory.GetAccessControl()' на проверку дочернего каталога, чтобы узнать, есть ли у вас доступ к Справочнику за ручку (этот вариант довольно сложно) (2) Использовать 'SearchOption.TopDirectoryOnly' вместо' SearchOption.AllDirectories', в сочетании с ** рекурсивным ** Поиск всех доступных каталогов для минимизации проблем с доступом – Ian