2013-11-09 88 views
0

我想要做的是獲得所有的目錄和每個目錄裏面的文件,並將其添加到列表。名單應該是這樣的,例如:我如何製作一個嵌套的FileInfo列表?

在指數[0] {[FileInfo的列表,並在所有文件]}

所以在每個索引我將有目錄和裏面的所有此目錄的文件。

我試圖做的:

private void getfiles() 
{ 
    List<List<FileInfo>> fileList = new List<List<FileInfo>>(); 
    for (int i = 0; i < BackgroundWorkerConfiguration.urlsDirectories.Count; i++) 
    { 
     System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(BackgroundWorkerConfiguration.urlsDirectories[i]); 
     fileList.AddRange(di.GetFiles("*.*", System.IO.SearchOption.AllDirectories).Where(x => x.Length > 0)); 
    } 
    file_array = fileList.OrderBy(x => x.CreationTime).Select(x => x.FullName).ToArray(); 
    //file_array = fileList.OrderByDescending(x => x.CreationTime).Select(x => x.FullName).ToArray(); 
    timer1.Enabled = true; 
} 

我在列表改變了List<FileInfo>List<List<FileInfo>>,這樣一個列表。

因此,最後如果我有硬盤上的5個目錄列表將有5個索引,並在每個索引將有一個列表與目錄的文件。

編輯**

這是Timer1 Tick事件:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    try 
    {  
     //this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
     for (int i = 0; i < file_array.Length; i++) 
     { 

     } 
     if (leave == true) 
     { 
      pb.Load(file_array[file_indxs]); 
     } 
     else 
     { 
      pbs[0].Load(file_array[file_indxs]); 
     } 
     file_indxs = file_indxs + 1; 
     if (file_indxs >= file_array.Length) 
     { 
      file_indxs = 0; 
     } 
    } 
    catch 
    { 
     timer1.Enabled = false; 
    } 
} 

我有8個pictureBoxes我在Form1構造函數創建它們。 在這種情況下,在計時器滴答事件中,我將圖像分配給第一個圖片框的pbs [0]。

我需要做的是使用嵌套列表,並將每個目錄的文件分配給一個pictureBox。 因此,嵌套列表中的第一個索引應該分配給第一個pictureBox pbs [0],然後索引1到pbs [1]等等。

所以如果嵌套列表有5個索引,它應該被分配到5個圖片框。

而是將所有圖像分配給pbs [0],這就是爲什麼我做了嵌套列表。

+0

究竟是什麼問題? – pasty

+0

問題是如何用FileInfo來完成它。我很久以前用String做過。但因爲我想排序文件我不知道如何在這種情況下做到這一點。我將FileInfo List更改爲嵌套列表,但不知道如何從那裏使用它。 –

+0

不知何故,很難說實際的問題和你的意圖是什麼。很多信息,但沒有問題。如果你能把你的實際問題縮小到1-2個句子和一個(更具體的)問題,我認爲這會有所幫助...... – Knickedi

回答

1

您需要將所有文件按目錄分組。有一些方法可以這樣做,例如,每當您準備枚舉目錄文件時,只需創建一個新的List<FileInfo>,列舉文件並將它們添加到新列表中,每個新創建的列表將被添加到根目錄List<List<FileInfo>>(其中可以轉換爲數組,如果你想)。不過,我想用這種辦法,將修改您的代碼儘可能少:

private void getfiles() { 
    List<FileInfo> fileList = new List<FileInfo>(); 
    for (int i = 0; i < BackgroundWorkerConfiguration.urlsDirectories.Count; i++) { 
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(BackgroundWorkerConfiguration.urlsDirectories[i]); 
    fileList.AddRange(di.GetFiles("*.*", System.IO.SearchOption.AllDirectories) 
         .Where(x => x.Length > 0)); 
    } 
    file_array = fileList.OrderBy(x => x.CreationTime) 
         .GroupBy(x => x.DirectoryName) 
         .Select(g => g.Select(x => x.FullName).ToList()) 
         .ToArray(); 
    timer1.Enabled = true; 
} 

注意:本file_array將有類型List<string>[](的List<string>數組)。您的問題看起來仍然不清楚,涉及timer1,但這應該解決您的問題(而不是您的整個問題)。你應該就相關問題提出另一個問題。這個答案只是回答你提供的問題

+0

King King,當我嘗試現在你的新答案即時通訊錯誤獲取線fileList.AddRange:錯誤最好的重載方法匹配'System.Collections.Generic.List > .AddRange(System.Collections.Generic.IEnumerable >)'有一些無效的參數並且此行上有另一個錯誤:錯誤參數1 :無法從'System.Collections.Generic.IEnumerable '轉換爲'System.Collections.Generic.IEnumerable >' –

+0

King and also一行錯誤:file_array = fileList.OrderBy(x => x.CreationTime)創建時間:錯誤'System.Collections.Generic.List '不包含可以找到'CreationTime'的定義,並且沒有找到接受'System.Collections.Generic.List '類型的第一個參數的擴展方法'CreationTime'(您是否缺少using指令或程序集引用? ) –

+0

@DoronMuzar更新了,我複製並粘貼了你的代碼,而沒有注意到'fileList'的聲明,它應該是'List ' –