はじめに
仕事でこの原因特定までに時間を要したので、情報を共有しておく。
現象
自社開発のバックアップツール(VB.NET)を関連会社に提供しているのですが、お客様から下記のエラーがログに出力されてバックアップが途中までで失敗している旨の問い合わせがありました。
【ログ】
「ファイル ~ が見つかりませんでした。」
「 ディレクトリが空ではありません。」
調査
「ファイル ~ が見つかりませんでした。」エラーは単純にファイルが見つからないだけだろうと、一方の「 ディレクトリが空ではありません。」エラーを調べてみたのですが、ネットで検索する限りではフォルダを削除する際にフォルダ内にファイルが残っていた場合にこのエラーが発生するとのこと。
フォルダを削除するタイミングとしては、バックアップツールで世代管理を実装しており世代を超えた場合に最古のフォルダを削除している。そして、フォルダ削除は「My.Computer.FileSystem.DeleteDirectory」メソッドの1行のみで行っている。
こちらでいろいろ試したが同様のエラーは発生しない。
お客様からエラー発生するフォルダのキャプチャ画像がメールで送られてきて、4フォルダ内の3つは正常にバックアップ出来るが最後の1フォルダでエラーが発生しているとのこと。
しかし、キャプチャ画像を見た限りでは何も問題ないので実際にエラーとなるフォルダをもらえることになった。中身は5つの画像(JPGファイル)が入っているだけで、特に問題がありそうなファイルは見当たらない。
しかし、バックアップツールで該当フォルダを指定してバックアップを取ると下記エラーが発生したのである。
「パス ‘~’ の一部が見つかりませんでした。」
このエラーをネットで調べることで、やっと原因が分かったのです。
参照:「パス ‘~’ の一部が見つかりませんでした。」のエラーについて
原因
「パス ‘~’ の一部が見つかりませんでした。」は、エラーメッセージに表示されているフォルダ名の最後にスペースの文字が含まれている場合に発生するとのこと。
実際にもらったフォルダ名の末尾には全角空白が含まれていたのである。キャプチャ画像では区別が付かないわけだ(^-^;
最後に
「フォルダ名 末尾 空白」でネット検索すれば、それなりに記事に見つかります。
過去にそのような体験をしたらなら、すぐに原因の推測が出来たのかも知れません。今回のエラーメッセージではその原因に辿り着かなかったので、記事のタイトルを見つけやすいものにしました。
上位フォルダを指定して下位フォルダに末尾空白のフォルダ名があった場合、「ファイル ‘~’ が見つかりませんでした。」となります。
これは空白を除去(Trim)してファイル検索してしまうため、一致しないと判断されてしまうのです。
参照
- [NETでのデレクトリ走査でデレクトリ名の最後がスペースで終わっていると止まる問題]
(http://d.hatena.ne.jp/hmori/20090113/p1) - [全角スペースがあるフォルダあるとSystem.IO.Directory.GetFilesがエラーになる]
(http://dobon.net/vb/bbs/log3-8/4859.html) - 末尾に全角空白を含むファイルのコピー