如何制作嵌套的FileInfo列表?

时间:2013-11-09 21:25:37

标签: c# winforms

我想要做的是将所有目录和每个目录放在里面并将其添加到List中。列表应该如下所示:

在索引[0] {[文件信息列表和此处的所有文件]}

所以在每个索引中我都会有目录并且在这个目录的所有文件中。

我试着这样做:

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个目录,那么List将有5个索引,并且在每个索引中都会有一个包含该目录文件的List。

编辑**

这是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个pictureBox我在form1构造函数中创建它们。 在这种情况下,在计时器刻度事件中,我将图像分配给pbs [0],即第一个图片框。

我需要做的是使用嵌套列表并将每个目录中的文件分配给pictureBox。 因此,嵌套列表中的第一个索引应该将文件分配给第一个pictureBox pbs [0],然后将索引1分配给pbs [1],依此类推。

因此,如果嵌套列表有5个索引,则应将其分配给5个pictureBox。

而是将所有图像分配给pbs [0],这就是我做嵌套列表的原因。

1 个答案:

答案 0 :(得分:1)

您需要按目录对所有文件进行分组。有一些方法可以这样做,例如每次准备枚举目录的文件时,只需创建一个新的List<FileInfo>,枚举文件并将它们添加到新列表中,每个新创建的列表都将添加到root 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的参与下,我的问题看起来仍然不清楚,但这应该可以解决您的问题(不是您的整个问题)。你应该问另一个相关问题。这个答案只是回答了你提出的问题