0

今日、私は非常に奇妙な c# エラーに遭遇しました。

任意のディレクトリにあるすべての XNA の xnb ファイルを検索して処理する小さなメソッドを作成しました。ほとんどのコンピューターでは、問題なく動作しました - いくつかのケースを期待してください (XP の 2 人が問題を報告しました)。

私はこのエラーをwin7で1回しか再現できませんでした(もちろん、VC#の外で)

メソッドは次のとおりです。

files = Directory.GetFiles("Content\\Textures\\Houses\\Roof");

for (int i = 0; i < files.Length; i++)
{
    string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", "");

    roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path)));
}

このメソッドは、指定されたディレクトリ (この場合は「Content\Textures\Houses\Roof」) 内のすべてのファイルを取得します。ここでエラーが発生します。このディレクトリには 3 つのファイルがあります (すべて .xnb 拡張子が付いています)。win7 を搭載した私の PC (および win7 を搭載した他の 4 台の PC) では、これは正常に動作します。

しかし、Win XP を使用している誰かがこのメソッドを実行しようとすると、OS は 4 つのファイルを返します。3 つの実際に存在するファイルと、最後に OpenFileDialog で開かれた 1 つのファイル (ファイルが完全に異なるディレクトリにある場合でも、Directory.Getfilesそのディレクトリにあるように戻します)。

そして、それを開こうとすると、メソッドはファイルを見つけられず、例外をスローします。

指定されたバック ファイルに .XNB 拡張子が付いているかどうかを確認することで、このエラーを克服できましたが、このエラーは本当に疑問に思います。

どこでエラーを起こしたのか分かりますか?

winform 領域の openfiledialog は、完全に異なるクラスである別の DLL でファイルを検索して開いている間、プライベートでアクセスできないメソッドであり、通信することさえできません。どうやってそのファイル名を取り戻したのか、まったくわかりません。

編集:

問題を明確にしていないと思います(申し訳ありません:)。

したがって、メソッドの問題: Directory.GetFiles(...) を使用すると、実際にはディレクトリにある 3 つのファイル (3 つの .xnb ファイル) が返されます。しかし、一部のユーザー (Windows XP を使用) の場合、このメソッドは、ディレクトリ内の ISNT である .sbm 拡張子 (私のプログラムが使用するファイルの種類) を 1 つ返します。私が知るまでかなり長い間検索しました:この問題は、Openfiledialog を使用する場合にのみポップアップします-使用すると、Directory.GetFiles(...) は以前に開いたファイルをそのまま返しますが、物理的にはそうではありません. この問題を回避できましたが、なぜこれが起こるのか理解できません。MSDN データベースを検索しましたが、このようなバグについては何もわかりませんでした。手がかりになることを期待して、VS内でバグを再現しようとしましたが、できませんでした。ある時、(win7 から) 問題が発生しましたが、VS の外部にあったため、デバッグできませんでした。現在、2 人の Windows XP ユーザーのみが報告されていますが、win7 を使用しているすべてのユーザーにとって問題なく動作します。

ああ、再確認しました-そのディレクトリには隠しファイル(特に以前に開いたファイル)はありません。必要な 3 つのファイルのみが含まれます。)

編集2:

問題のリンクと、問題を作成する手順は次のとおりです。

https://www.dropbox.com/s/4uv1hbvzkhpwprw/House%20Creator%20V2%20With%20error.zip

Housecreator.exe を起動し、「読み込み」ボタンをクリックします。「郊外の家1.sbm」を選択

読み込まれたら、[3D レンダリング] ボタンをクリックします。

そして、これはエラーがポップアップするステップです。プログラムは、(Content)\Textures\Houses\OuterWall で「Suburb house 1.sbm」ファイルを検索します (ほとんどの場合、XP ユーザーの場合もありますが、私にも発生することがあります。ただし、Visual Studio の外部のみ)。 .

プログラムを試すには、XNA フレームワーク 3.1 と .NET 3.5 が必要です。また、ユーザーが「ロード」オプションを使用した場合にのみエラーがポップアップします。

編集 3: エラーが 3 回続けて発生しました。指定されたディレクトリ内に余分なファイルはありませんでした。そして今、目に見える変化なしに再び機能しています Oo

なぜこれが起こっているのか、アイデアが不足しています。

編集4:

私はあきらめました。私はどこかで間違いを犯していると確信していますが(それがこの大きなバグである可能性はないと思いますし、他の誰もまだ気づいていません)、どこにあるのかわかりません。ファイルをフィルタリングしましたが、うまくいくはずです。助けてくれてありがとう!:)

4

1 に答える 1

1

Directory.GetFiles() が 4 つのファイルを返す場合、引数として指定したディレクトリに 4 つのファイルがあります。

それらが非表示で保護されたシステム ファイルなどである場合、Windows エクスプローラーに表示されない場合があります。

とにかく、あなたのアプリケーションは、特定のフォルダー内の関係するファイルだけを見ることを期待すべきではありません。それを制御することはできません。

問題の解決策は、気にしないファイルを除外して無視することです。

for (int i = 0; i < files.Length; i++) 
{ 
    if(files[i].EndsWith(".xnb"))
    {
        string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", ""); 

        roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path))); 
    }
} 
于 2012-06-15T19:38:05.460 に答える