簡體   English   中英

奇怪的C#Directory.GetFiles錯誤

[英]Strange C# Directory.GetFiles error

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

我寫了一個小方法,它應該在任何給定目錄中搜​​索和處理所有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)));
}

此方法獲取給定目錄中的所有文件,在本例中為“ Content \\ Textures \\ Houses \\ Roof”。 出現錯誤:此目錄中有三個文件(所有文件都帶有.xnb擴展名)。 在我的帶有win7的PC上(以及其他四個帶有win7的家伙的PC上),此工作也應正常進行。

但是,當使用Win XP的人嘗試運行此方法時,操作系統會返回4個文件-以及三個真正退出的文件,以及最后一次使用OpenFileDialog打開的一個文件(即使該文件位於完全不同的目錄Directory.Getfiles中)像在該目錄中一樣將其返回。)

當我想打開它時,該方法找不到文件,並引發異常。

我可以通過檢查給定的后綴文件是否具有.XNB擴展名來克服此錯誤,但此錯誤確實使我感到奇怪。

知道我哪里出錯了嗎?

openfile對話框位於winform區域,而文件則以私有的,不可訪問的方法在另一個DLL(完全不同的類)中搜索和打開,它們甚至不應該以任何方式進行通訊! 我不知道我怎么回來的那個文件名。

編輯:

我想我沒有說清楚我的問題(對此很抱歉:)。

因此,方法中的問題:當我使用Directory.GetFiles(...)時,它會退回實際上在目錄中的三個文件(三個.xnb文件)。 但是對於某些用戶(使用Windows XP),此方法會返回一個.sbm擴展名(我的程序使用的文件類型),該擴展名為ISNT。 我搜索了很長時間才發現:這個問題僅在他們使用Openfile對話框時彈出-當他們這樣做時,Directory.GetFiles(...)會返回先前打開的文件,但是從物理上講不是。 我能夠解決此問題,但仍然無法理解為什么會發生這種情況。 我搜尋了MSDN數據庫,但沒有發現有關此類bug的任何信息。 我試圖在VS中重新創建該錯誤,希望它能提供一個線索-但我無法做到。 有一次我也遇到了這個問題(來自win7),但是由於它不在VS之外,所以我無法調試。 目前只有兩個win XP用戶報告過,而使用win7的每個人都可以正常使用。

哦,我仔細檢查了-該目錄中沒有隱藏文件(尤其是以前打開的文件)。 里面只有三個所需文件。)

編輯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 Framework 3.1,以及.NET 3.5才能試用該程序。 並且僅當用戶使用“加載”選項時才會彈出錯誤。

編輯3:我在該行中出現了3次錯誤。 給定目錄內沒有多余的文件。 現在,它再次工作,沒有任何明顯的變化

我已經不知道為什么會這樣了。

編輯4:

我放棄了 我很確定我在某個地方犯了一個錯誤(我不認為這可能是一個巨大的錯誤,而且還沒有人注意到),但是無法發現錯誤的所在。 我過濾了文件,這應該工作。 謝謝大家的幫助! :)

如果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))); 
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM