Доступ к пути 'c:\$Recycle.Bin\S-1-5-18' запрещен
У меня есть этот код для копирования всех файлов из исходного каталога, F:\
, в каталог назначения.
public void Copy(string sourceDir, string targetDir)
{
//Exception occurs at this line.
string[] files = System.IO.Directory.GetFiles(sourceDir, "*.jpg",
SearchOption.AllDirectories);
foreach (string srcPath in files)
{
File.Copy(srcPath, srcPath.Replace(sourceDir, targetDir), true);
}
}
и получить исключение.
Если я опущу SearchOption.AllDirectories
и это работает, но только копирует файлы из F:\
3 ответа
Используйте следующую функцию вместо System.IO.Directory.GetFiles:
IEnumerable<String> GetAllFiles(string path, string searchPattern)
{
return System.IO.Directory.EnumerateFiles(path, searchPattern).Union(
System.IO.Directory.EnumerateDirectories(path).SelectMany(d =>
{
try
{
return GetAllFiles(d,searchPattern);
}
catch (UnauthorizedAccessException e)
{
return Enumerable.Empty<String>();
}
}));
}
Объекты файловой системы подлежат безопасности. Некоторые объекты файловой системы защищены таким образом, что к ним могут получить доступ только определенные пользователи. Вы столкнулись с файлом, к которому пользователь, выполняющий код, не имеет достаточных прав для доступа.
Причина, по которой у вас нет прав доступа к этой конкретной папке, заключается в защите безопасности различных пользователей системы. Данная папка является корзиной на этом диске. И каждый отдельный пользователь имеет свою собственную корзину, доступ к которой есть только у них. Если кто-нибудь сможет получить доступ к корзине любого другого пользователя, тогда пользователи смогут читать файлы друг друга, что является явным нарушением политики безопасности системы.
Возможно, самый простой способ обойти это - пропустить скрытые папки на корневом уровне диска. Это простое изменение будет достаточно для решения вашей проблемы, потому что вы, конечно, не хотите копировать корзины.
Эта папка является защищенной системной папкой (ваша корзина, каждый диск имеет свою собственную корзину). Просто поместите файл file.copy в оператор try catch и проигнорируйте / зарегистрируйте все ошибки. Таким образом, вы будете только копировать реальные файлы и пропускать системные файлы / папки.
Если вы действительно хотите избежать оператора try catch. Используйте классы fileinfo и info, чтобы выяснить, какие папки / файлы относятся к системе, и сгенерирует исключение.
Это должно помочь:
private IEnumerable<string> RecursiveFileSearch(string path, string pattern, ICollection<string> filePathCollector = null)
{
try
{
filePathCollector = filePathCollector ?? new LinkedList<string>();
var matchingFilePaths = Directory.GetFiles(path, pattern);
foreach(var matchingFile in matchingFilePaths)
{
filePathCollector.Add(matchingFile);
}
var subDirectories = Directory.EnumerateDirectories(path);
foreach (var subDirectory in subDirectories)
{
RecursiveFileSearch(subDirectory, pattern, filePathCollector);
}
return filePathCollector;
}
catch (Exception error)
{
bool isIgnorableError = error is PathTooLongException ||
error is UnauthorizedAccessException;
if (isIgnorableError)
{
return Enumerable.Empty<string>();
}
throw error;
}
}