2012-06-24 53 views
0

我試圖得到一個文件列表排序,沒有成功。得到遞歸的文件列表按字母順序排序的子文件和文件名

它遞歸獲取文件,但沒有任何順序。

下面的代碼:

private void Step2_Load(object sender, EventArgs e) 
{ 
    foreach (string file in GetFiles(PathClient)) 
    { 
     string flist = ""; 
     if (file.Contains(PathClient + "\\")) 
      flist = file.Replace(PathClient + "\\", ""); 
     else 
      flist = file.Replace(PathClient, ""); 

     LB_FULL.Items.Add(flist); 
    } 
. 
. 
. 

static IEnumerable<string> GetFiles(string path) 
{ 
    Queue<string> queue = new Queue<string>(); 
    queue.Enqueue(path); 
    while (queue.Count > 0) 
    { 
     path = queue.Dequeue(); 
     try 
     { 
      foreach (string subDir in Directory.GetDirectories(path)) 
       queue.Enqueue(subDir); 
     } 
     catch (Exception ex) 
     { 
      //ex 
     } 
     string[] files = null; 
     try 
     { 
      files = Directory.GetFiles(path); 
     } 
     catch (Exception ex) 
     { 
      //ex 
     } 
     if (files != null) 
     { 
      for (int i = 0; i < files.Length; i++) 
      { 
       yield return files[i]; 
      } 
     } 
    } 
} 

我已經試過排序依據,但它只能通過各種各樣的文件名,無論子文件夾中。

我想先按子文件夾排序,然後按文件名排序。

for ex。

/ 
/file_a.bla 
/file_b.bla 
/file_c.bla 
/sub1/file_a.bla 
/sub1/file_b.bla 
/sub2/_file_x.bla 
/testsub/a.bla 
... 

等等。

任何想法如何管理它?

回答

0

是否需要執行自己的遞歸搜索,或者是否可以使用Directory.GetFiles的適當重載?

總之,使用過載,您可以將文件,我想你想排序(你沒有提到你怎麼想訂購的子目錄):

string dirToSearch = @"C:\temp"; 
string[] files = Directory.GetFiles(dirToSearch, "*.*", SearchOption.AllDirectories); 
var mySortedFiles = files.OrderBy(r => Path.GetDirectoryName(r)). 
    ThenBy(p => p.Count(c => c == Path.PathSeparator)). 
    ThenBy(s => Path.GetFileNameWithoutExtension(s)). 
    Select(t => t.Replace(dirToSearch, "")); 

foreach (string s in mySortedFiles) 
    Console.WriteLine(s); 

Console.ReadLine(); 

其中給出,例如:

\CrossJoinA-H.sql 
\ip-to-country.csv 
\Kalimba.mp3 
\LoadAssembly.sql 
\ProcToUseAssembly.sql 
\test.txt 
\a\New Bitmap Image.bmp 
\a\New Text Document.txt 
\a\c\New Text Document.txt 
\b\New Text Document.txt 
\b\New Text Document (2).txt 
+0

謝謝,這有很大的幫助。 但如果我直接列出一個驅動器(例如N:\),它顯示的驅動器號不應顯示。 否則它的工作原理應該如此 – Thyrador

+0

你的意思是如果你設置了'string dirToSearch = @「H:」;'那麼它仍然顯示'H:'? –

+0

是的。另一件事是,代碼(我也是)不處理大於260個字符的路徑,對嗎? – Thyrador

相關問題