C# がディレクトリをスキャンするバックアップ アプリケーションを作成しています。ディレクトリ内のすべてのファイルとサブファイルを取得するために、このようなものを使用する前に:
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
}
唯一の問題は、ファイルにアクセスできず、いくつかのエラーが発生することです。私が得るエラーの例は次のとおりです。
その結果、現在のディレクトリ内のすべてのファイルをスキャンする再帰的な方法を作成しました。そのディレクトリにディレクトリがある場合、そのディレクトリを渡してメソッドが再度呼び出されます。この方法の良いところは、ファイルを try catch ブロック内に配置して、エラーがない場合はそれらのファイルをリストに追加し、エラーがある場合はディレクトリを別のリストに追加するオプションを提供できることです。
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);
}
}
}
次のような例外を処理しようとすると、問題が発生します。
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");
}
例外が発生した場合、ファイルを取得できません。