Я создаю приложение для резервного копирования, где С# сканирует каталог. Прежде чем использовать это, чтобы получить все файлы и подфайлы в каталоге:
DirectoryInfo di = new DirectoryInfo("A:\\");
var directories= di.GetFiles("*", SearchOption.AllDirectories);
foreach (FileInfo d in directories)
{
//Add files to a list so that later they can be compared to see if each file
// needs to be copid or not
}
Единственная проблема заключается в том, что иногда к файлу не удалось получить доступ, и я получаю несколько ошибок. пример ошибки, которую я получаю:
В результате я создал рекурсивный метод, который будет проверять все файлы в текущем каталоге. Если там где каталоги в этом каталоге, то метод будет вызываться снова, передавая этот каталог. Самое приятное в этом методе заключается в том, что я могу разместить файлы внутри блока catch try, предоставляя мне возможность добавлять эти файлы в список, если там, где нет ошибок, и добавление каталога в другой список, если у меня были ошибки.
try
{
files = di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
//info of this folder was not able to get
lstFilesErrors.Add(sDir(di));
return;
}
Таким образом, этот метод отлично работает, единственная проблема заключается в том, что при сканировании большого каталога это занимает много времени. Как я мог ускорить этот процесс? Мой фактический метод - это, если вам это нужно.
private void startScan(DirectoryInfo di)
{
//lstFilesErrors is a list of MyFile objects
// I created that class because I wanted to store more specific information
// about a file such as its comparePath name and other properties that I need
// in order to compare it with another list
// lstFiles is a list of MyFile objects that store all the files
// that are contained in path that I want to scan
FileInfo[] files = null;
DirectoryInfo[] directories = null;
string searchPattern = "*.*";
try
{
files = di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
//info of this folder was not able to get
lstFilesErrors.Add(sDir(di));
return;
}
// if there are files in the directory then add those files to the list
if (files != null)
{
foreach (FileInfo f in files)
{
lstFiles.Add(sFile(f));
}
}
try
{
directories = di.GetDirectories(searchPattern, SearchOption.TopDirectoryOnly);
}
catch
{
lstFilesErrors.Add(sDir(di));
return;
}
// if that directory has more directories then add them to the list then
// execute this function
if (directories != null)
foreach (DirectoryInfo d in directories)
{
FileInfo[] subFiles = null;
DirectoryInfo[] subDir = null;
bool isThereAnError = false;
try
{
subFiles = d.GetFiles();
subDir = d.GetDirectories();
}
catch
{
isThereAnError = true;
}
if (isThereAnError)
lstFilesErrors.Add(sDir(d));
else
{
lstFiles.Add(sDir(d));
startScan(d);
}
}
}
Ant проблема, если я попытаюсь обработать исключение с чем-то вроде:
DirectoryInfo di = new DirectoryInfo("A:\\");
FileInfo[] directories = null;
try
{
directories = di.GetFiles("*", SearchOption.AllDirectories);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("There was an error with UnauthorizedAccessException");
}
catch
{
Console.WriteLine("There was antother error");
}
Это, если возникает исключение, я не получаю никаких файлов.