2012-06-15 201 views
0

今天我遇到了一個非常奇怪的C#錯誤。奇怪的C#Directory.GetFiles錯誤

我寫了一個小方法,它應該搜索並處理任何給定目錄中的所有XNA的xnb文件。在大多數計算機上,它工作得很好 - 預計會出現一些情況(XP中有兩個人報告了問題)。

我只能重現此錯誤Win7上一次(和關閉過程中,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))); 
} 

這種方法得到的所有文件給定的目錄,在這種情況下,「內容\紋理\房屋\屋頂」。在這裏出現錯誤:在這個目錄中有三個文件(都帶有.xnb擴展名)。在我的電腦上使用win7(和另外四個使用win7的電腦),這項工作就像它應該的一樣。

但是,當有人用win XP試圖運行這種方法時,操作系統會返回4個文件 - 這三個真正退出的文件,以及上次打開的OpenFileDialog文件(即使文件完全不同的目錄中, Directory.Getfiles就像它在那裏,在那個目錄中那樣回覆它)。

而當我想打開它,該方法不找到該文件,並拋出一個異常。

我能夠通過檢查給定的後退文件是否具有.XNB擴展名來克服這個錯誤,但是這個錯誤真的讓我感到驚訝。

任何想法,我犯了一個錯誤?

在Winform區域中的openfiledialog,而在另一個DLL中搜索和打開文件,完全不同的類,在一個私人的,不可訪問的方法 - 他們甚至不應該以任何方式溝通!我沒有任何想法,我怎麼回到那個文件名。

編輯:

我覺得我沒有做我的問題明確(對不起,那:)。

因此,該方法中的問題:當我使用Directory.GetFiles(...)時,它返回三個真正在目錄中的文件(三個.xnb文件)。但對於某些用戶(使用Windows XP),此方法會返回一個.sbm擴展名(文件類型是我的程序使用),該目錄中包含ISNT。我搜索了相當長的時間,直到我發現:當他們使用Openfiledialog時,這個問題纔會彈出 - 當他們這樣做時,Directory.GetFiles(...)將返回之前打開的文件 - 但實際上它沒有。我能解決這個問題,但仍不知道爲什麼會發生這種情況。我通過MSDN數據庫進行了搜索,但我沒有發現任何有關這樣的錯誤的信息。我試圖重新創建VS內部的bug,希望它能提供一些線索 - 但我無法做到。有一次這個問題也出現在我身上(從win7開始),但是因爲它不在VS之內,所以我無法進行調試。目前只有兩個贏得XP用戶報告,而它的作品適合每個人使用win7。

哦,我再次檢查 - 在該目錄中沒有隱藏文件(特別是以前打開的文件)。只有三個所需的文件裏面。)

編輯2:

這裏是鏈接的問題,並創建問題的步驟:

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

啓動Housecreator.exe 點擊 「Load」 按鈕。 選擇「郊區房屋1.sbm」

當其加載時,單擊「3D渲染」按鈕。

這是錯誤應該彈出的步驟。該程序將搜索(Content)\ Textures \ Houses \ OuterWall中的「Suburb house 1.sbm」文件(有時主要用於xp用戶,但有時它也適用於我,但僅限於Visual Studio以外) 。

需要XNA框架3.1和.NET 3.5以及試用該程序。只有當用戶使用「加載」選項時纔會彈出錯誤。

編輯3:我在連續三次出錯。給定目錄內沒有額外的文件。現在它再次工作,沒有任何可見的變化O.o

從想法出發,爲什麼會發生這種情況。

編輯4:

我放棄了。我敢肯定,我在某個地方犯了一個錯誤(我不認爲這可能是這個巨大的錯誤,並且沒有人注意到),但無法捕捉到它在哪裏。我過濾文件,這應該工作。謝謝大家的幫助! :)

+0

第一步是如果錯誤來自Directory.GetFiles或來自您自己的代碼,則縮小範圍。看起來你更有可能在「roofTextures」中添加了一些東西,但沒有意識到它。 –

+0

什麼例外和地點?這個fundemental信息如何失蹤?難怪你無法調試! – banging

+0

想說什麼可能會說:「拋出的異常在哪裏?」......可以毫不侮辱地說。 – hometoast

回答

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))); 
    } 
} 
+0

是的,我使用了這種解決方案 - 但仔細檢查,並說上述文件不存在。不是隱藏的,或者任何東西 - 它在物理上位於不同的目錄中。我們使用Dropbox,其他人從同一個目錄啓動程序,打開相同的文件 - 雖然它爲win7用戶工作,但它並不適用於兩個XP用戶。 (我也使用了這種過濾方法,但我仍然無法理解這個問題)。 –