2012-08-07 49 views
2

我試圖找到指定的文件夾中的子目錄文件(我們稱之爲MyFolder文件)以及子目錄保存到一個字符串變量,以在別處使用。問題是,該指定文件夾中可能有多個子目錄,每個子目錄可能包含它們自己的子目錄。 MyFolder下樹中的所有子目錄中只有一個具有我正在查找的文件。獲得一個子目錄作爲一個字符串返回類型

在下面的例子,它可以是在任一的(可能更多,但對於本示例)的兩個位置,但從未兩者。當然,我試圖找到blah.txt

我做了一個遞歸的foreach循環,如下所示,但它只會返回子目錄,如果該文件在第一級子目錄(/a, or /b)中找到。如果該文件是在/aa or /bb或更深(root/a/aa/aaa,爲例),則返回NULL每次。我花了好幾個小時試圖通過緩慢地逐步調試調試器並仔細觀察本地窗口來解決這個問題,但我似乎無法弄清楚什麼是錯誤的。它發現的文件和存儲,而在第二foreach環,但後來,由於某種原因,它開始向後循環(展示,直至碰到return "Null";以前的目錄)正確的子目錄路徑。如果在第一級子目錄內找到該文件,則不會發生這種情況,只有在第二級或更深級別內找到該文件時纔會發生。

class Program 
{ 
    static string dir = @"C:\MyFolder\"; 

    static void Main(string[] args) 
    { 
     Console.WriteLine(GetDirectory(dir)); 
     Console.ReadKey(); 
    } 

    static string GetDirectory(string dir) 
    { 
     foreach (string dName in Directory.GetDirectories(dir)) 
     { 
      foreach (string fName in Directory.GetFiles(dName, "blah.txt")) 
      { 
       return dName; 
      } 
      GetDirectory(dName); 
     } 
     return "NULL"; 
    } 
} 

我見過這樣的事情工作的唯一方法是,如果你不想要保存爲能夠使用一個字符串來(甚至可能是由其他功能)在其他地方使用的路徑,但要把它顯示立即作爲無效返回類型,例如在控制檯中(通過將返回更改爲"Console.WriteLine(dName)"並適當修改函數調用)。我對C#非常陌生,以前我唯一的編碼經歷是JavaScript和AutoHotkey,所以我對這類語言的瞭解還是非常有限,而我所擁有的僅僅是C#初學者指南書我已經通過閱讀和互聯網......我已經通過勇敢的努力尋找這個具體問題無濟於事。所以,任何幫助或指針,非常感謝!

回答

6

爲什麼沒有土色遞歸搜索內置的?

喜歡的東西

Directory.GetFiles(@"C:\MyFolder\", "blah.txt", SearchOption.AllDirectories) 

看一看​​3210和SearchOption Enumeration

甚至DirectoryInfo

喜歡的東西

new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories) 
+0

這太簡單了,它的工作原理很好..只是不知道SearchOption參數。非常感謝你,尤其是對原來建議的鏈接和補充。非常感謝! – TheArtofX 2012-08-07 07:11:26

1

移動文件循環是你的目錄循環之前。 將返回更改爲dir而不是dName。

+0

無論我如何嘗試這個,我都無法讓它工作..它總是返回NULL時首先安裝文件循環。問題已被其他用戶回答,但感謝您的回覆。 – TheArtofX 2012-08-07 07:19:44

1

如何簡單地把第一個被發現Directory.EnumerateFiles()

var fileToSearch = "blah.txt"; 
var matchingFile = Directory.EnumerateFiles(dir, fileToSearch, SearchOption.AllDirectories) 
           .FirstOrDefault(); 

if(matchingFile != null) 
{ 
    Console.WriteLine("File found: " + matchingFile); 
} 
else 
{ 
    Console.WriteLine("Could nowhere below \"" + dir + "\" find the file \"" + fileToSearch + "\"."); 
} 
+0

這也起到了作用,但上面的答案對於我所列出的特定實例而言更簡單的代碼明智。我絕對不知道這種方法來找到一個文件,所以反應非常讚賞! – TheArtofX 2012-08-07 07:14:55

相關問題