配列内のディレクトリ内のすべてのファイル(サブフォルダー内のファイルを含む)を取得したい
string[] filePaths = Directory.GetFiles(@"c:\",SearchOption.AllDirectories);
これに伴う問題は次のとおりです。例外がスローされると、コマンド全体が停止します。フォルダにアクセスできない場合にフォルダをスキップするように、これを行うためのより良い方法はありますか?
おそらく、自分でもう少し入力して、次のようなディレクトリウォーカーを作成する必要があります。
public static string[] FindAllFiles(string rootDir) {
var pathsToSearch = new Queue<string>();
var foundFiles = new List<string>();
pathsToSearch.Enqueue(rootDir);
while (pathsToSearch.Count > 0) {
var dir = pathsToSearch.Dequeue();
try {
var files = Directory.GetFiles(dir);
foreach (var file in Directory.GetFiles(dir)) {
foundFiles.Add(file);
}
foreach (var subDir in Directory.GetDirectories(dir)) {
pathsToSearch.Enqueue(subDir);
}
} catch (Exception /* TODO: catch correct exception */) {
// Swallow. Gulp!
}
}
return foundFiles.ToArray();
}
またはこれを試してください:
DirectoryInfo dirs = new DirectoryInfo(@"c:\");
List<string> filenames = (from i in dirs.GetFiles("*", SearchOption.AllDirectories)
select i.Name).ToList();
または拡張子のないファイル名:
DirectoryInfo dirs = new DirectoryInfo@"c:\");
List<string> filenames = (from i in dirs.GetFiles("*", SearchOption.AllDirectories)
select System.IO.Path.GetFileNameWithoutExtension(i.Name)).ToList();
これを試して :
DirectoryInfo directory = new DirectoryInfo(@"c:\");
DirectoryInfo[] folders = directory.GetDirectories("*", SearchOption.AllDirectories);
List<string> files = new List<string>();
foreach (DirectoryInfo info in folders)
{
foreach (FileInfo file in info.GetFiles())
{
files.Add(file.Name);
}
}