2011-06-24 9 views
4

GetFiles:間違った結果、私は再帰呼び出しに次のコードを使用してい

var files = di.GetFiles("*.jpg"); 

ディは、関数に渡されるDirectoryInfoです。いくつかのドライブkのルートにtiger.jpgというファイルがあるとします。場合によっては、結果はk:\ tiger.jpgではなくk:\ iger.jpgです。私はなぜ、どのように考えているのか分かりません。誰も同じ行動をしたことがありますか?

編集1:再帰関数は画像をサブディレクトリに表示しないため、ディレクトリ名でも表示されるようです。私はそれが主にFATだと思う(それは通常、SDカードやUSBスティックなどのメディアから読み込み、時にはDVDやCDから読み込むため)。

返される各FileInfoオブジェクトのフルネームは、イベントを使用して通知されます。受信者は、パスをコンストラクタの引数としてとる新しいオブジェクトを作成します。コンストラクタは、JPEGファイルの情報を取得するためのパスを使用してメソッドを呼び出します。

FileStream fs = File.Open (this.Path, FileMode.Open); 
Image img = Image.FromStream (fs, false, false); 

例外が発生した場所です。私はフレームワークコンポーネントへの呼び出しからファイルを取得するので、私はそれが存在するかどうか再度明示的にチェックしません - 私はシステムにこれを構築することができますが、それは私の問題を解決しません。

ことの一つは、私が忘れてしまった:これは我々のテストシステムでは発生しませんが、世界中:(ラウンドシステムに

+0

非常に奇妙な...あなたはファイル名の処理に奇妙な文字列ではありませんか? – mpen

+0

これはいつ起こるか教えてください。それはルートディレクトリ上にあるだけですか?FATファイルシステムだけですか?常に問題と同じファイルですか? – Gabe

+0

受信したファイル名を確認するコードを表示します。 –

答えて

1

と置き換えるように書きます。この特定のケースでは、ハードウェアの特定の組み合わせで、奇妙な動作を引き起こしたようです。 .NET APIが間違った結果を返す間にWin32 APIが正しい結果を返しました。

これは、すべてのインストールで再現できませんでした。唯一の明らかな違いはローカリゼーションの設定だけでしたが、機能的にそれらを変更しても、私たちのローカルマシンのいずれかでレクロを思いつくのに役立つものではありませんでした。新しいハードウェアリビジョンが公開されるため、これ以上の調査はありません。

他の回答からすべての提案をカバーしていて、まったく同じ問題がある場合は、OSベンダーにお問い合わせください。

1

Antivirusは時々ここに遊びに来ることができるあなたはファイルと一つのプロセスを生成する一つのプロセスを持っている場合。

ファイルの有無を確認するのではなく、File.Openを呼び出して/ catchを試してIOExceptionにしてください。例外。

ファイルが存在するとは決して想像できません。

なぜファイル名の文字が失われているのかについては、どうすればthis.Pathを生成していますか?

+0

ファイルは外部メディアにあります。挿入されると、GetFilesメソッドを使用して読み込まれます。したがって、パスは正しいファイル名をリストするために信頼するフレームワークメソッドから返されます。 – Sascha

+0

ウイルス対策オプションをチェックします。 – Sascha

+0

無効AV、変更なし – Sascha

3

間違ったストローかもしれませんが、\をエスケープしようとしましたか?

k:\tiger.jpgの例では、C#は\tをタブとして読み取ります。これは本当に起こるべきではありませんが、私はそれが起こるのを見ました。すべてのバックスラッシュを\\

+0

私は実際に私の文章でエスケープしています。ファイル名は、GetFilesメソッドによって返されます。パスは実際にはコード化されておらず、手動で入力されませ – Sascha

関連する問題