##状況
「C# ファイル 一覧 取得」とかググれば、指定したディレクトリパス以下のファイルを取得する方法なんていくらでも出てくる。
それに習って、再帰処理でDirectory.GetFiles(~)
とDirectory.GetDirectories(~)
を使って深部へと潜りつつファイル一覧を取得するものとか、.NET FW4.0以上だったらDirectory.EnumerateFiles(~)
を使って一度に取得なんてことをするものだと思う。
この時、検索元のディレクトリの指定「C:\」や「D:\」といったドライブ直下にした時、プログラムがコケるケースがあった。
原因は隠しフォルダの「RECYCLE.BIN」で、要は操作しているユーザのアクセス権が無いゴミ箱(他のユーザのゴミ箱だったりとか)を読み取ることができずに例外を吐いて死んでしまうことに気がついた。
これを回避するためには、再帰処理に読み取れなかった場合を考慮してちゃんとtry~catchしてあげればいいという単純なもの。
指定したパス以下のファイル一覧を取得なんて処理はよく使うし、良い機会なのでこうしてメモする。
##ソース
今回catchしても特段処理はしていない。使うアプリケーションによって、ログを吐くなりして丁寧に止めるなりすればいいだろう。
まあ、今回は止めないためにこうして書いたのだけど。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
public class FileUtil
{
public static List<String> GetAllFiles(String DirPath)
{
List<String> lstStr = new List<String>();
String[] strBuff;
try
{
// ファイル取得
strBuff = Directory.GetFiles(DirPath);
foreach (String s in strBuff)
{
lstStr.Add(s);
}
// ディレクトリの取得
strBuff = Directory.GetDirectories(DirPath);
foreach (String s in strBuff)
{
List<String> lstBuff = GetAllFiles(s);
lstBuff.ForEach(delegate(String str)
{
lstStr.Add(str);
});
}
}
catch(System.UnauthorizedAccessException)
{
// アクセスできなかったので無視
}
return lstStr;
}
}
##解説
特段特別なことをせず、指定したディレクトリからまずはファイル一覧を取得し、その後ディレクトリを取得する。
取得できたディレクトリを元に再起動を繰り返し、深部の階層へと潜っていく。前述した通り、よくある再帰処理を利用したファイル一覧取得ロジックだ。