NETでのデレクトリ走査でデレクトリ名の最後がスペースで終わっていると止まる問題
ちょっと下らない事をするために、C#でバカなコードを書いていたのですが、これがうまく動かない。
以下のメソッドは次のような形で呼び出して、その中のファイルをfile_listに入れる物と考えてください。
#元々のプログラムがやっている事は恥ずかしくてここでは書けません。
DirectoryInfo di = new DirectoryInfo("C:\\data");
int num = execDirFiles(di);
public int execDirFiles(DirectoryInfo di) { int num = 0; foreach (FileInfo info in di.GetFiles()) { file_list.add(info.FullName); num++; } foreach (DirectoryInfo sdir in di.GetDirectories()) { // DirectoryInfo mdir = new DirectoryInfo(sdir.FullName + "\\"); // num += execDirFiles(mdir); num += execDirFiles(sdir); } return num; }
さて、このメソッド、問題がなさそうですが、"デレクトリ名 "というような漢字のスペースがデレクトリー名の最後に含まれると、次の例外が発生します。
'System.IO.DirectoryNotFoundException' のハンドルされていない例外が mscorlib.dll で発生しました。 追加情報: パス 'C:data\in6\デレクトリ名' の一部が見つかりませんでした。
エラーの箇所は di.GetFiles() で di を見ると、
di.demanDir[0] = "C:\data\in6\デレクトリ名 \\." →修正 "C:\\data\\in6\\デレクトリ名 \\."
di.base = {デレクトリ名 }
とdiの内容そのものは問題なさそうです。
それで同じ問題でひっかかっている人がいないかと、googleに頼ってみました。すると、
全角スペースがあるフォルダあるとSystem.IO.Directory.GetFilesがエラーになる http://dobon.net/vb/bbs/log3-8/4859.html
そこで num += execDirFiles(sdir) と再起処理させている部分を、コメントアウトしてあるソースに直した所動くようになりました。
しかしコードが汚い以前になぜこの問題が発生するのかがわかりません。後で調べるためにメモしておきます。