【问题标题】:How can i search first for a specific directory gif file and then continue to the rest?如何首先搜索特定目录的 gif 文件,然后继续搜索其余部分?
【发布时间】:2017-01-05 21:34:21
【问题描述】:
private void timer1_Tick(object sender, EventArgs e)
{
     DirectoryInfo dir1 = new DirectoryInfo(@"C:\Users\Chocolade\AppData\Local\SatellitesImagesDownloads\SatellitesImagesDownloads\Countries\Israel\");
     fi = dir1.GetFiles("*.gif");

     foreach (FileInfo finfo in fi)
     {
         if (fi.Length > 0 && finfo.Length > 0)
         {
              timer1.Enabled = false;
              pictureBox1.Load(finfo.FullName);

              listView1.Items[0].Checked = true;
         }
     }
}

这适用于以色列目录。

定时器间隔设置为100。

一旦它在以色列目录中找到一个 gif 文件,它就会将其加载到 pictureBox1 并检查 listView1 中的 CheckBox 是否有此项目。

但现在我想改变它,让它搜索所有子目录,但首先只搜索以色列。一旦它找到以色列并将 gif 加载到 pictureBox1 并检查 CheckBox 然后继续并搜索所有其他子目录,当子目录中有 gif 文件时,请选中 listView1 中的复选框。

listView1 中的项目按国家/地区名称排列。

现在我更改了代码,但它还没有达到我想要的效果:

现在只在以色列目录中搜索,而是在国家/地区下搜索所有子目录。

但不知道如何从这里继续。

private void timer1_Tick(object sender, EventArgs e)
{
     DirectoryInfo dir1 = new DirectoryInfo(@"C:\Users\Chocolade\AppData\Local\SatellitesImagesDownloads\SatellitesImagesDownloads\Countries\");
     fi = dir1.GetFiles("*.gif", SearchOption.AllDirectories);

     foreach (FileInfo finfo in fi)
     {
         if (fi.Length > 0 && finfo.Length > 0)
         {
              timer1.Enabled = false;
              pictureBox1.Load(finfo.FullName);

              listView1.Items[0].Checked = true;
         }
     }
}

【问题讨论】:

  • 你为什么需要一个计时器?这似乎是后台线程中的搜索,需要在查找结果时使用Invoke 更新 UI。
  • 如果您的目录中没有大量文件:从根目录和子目录中搜索所有 gif 文件名,在您方便的时候对文件名列表进行排序,然后启动计时器以显示列表的下一项并增加下一项的索引,最初设置为 0)。
  • 如果您找到多个 *.gif 文件,您的循环将仅加载最后一个。这是故意的吗?

标签: c# .net winforms subdirectory


【解决方案1】:

您实际上已经用文字描述了您的算法:

但首先仅适用于以色列,一旦它发现以色列将 gif 加载到图片框 1 并选中复选框

这里实际上不需要for循环,因为如果您找到多个文件,您将加载最后一个文件,您可以使用Last()方法

DirectoryInfo dir1 = new DirectoryInfo(@"C:\Users\Chocolade\AppData\Local\SatellitesImagesDownloads\SatellitesImagesDownloads\Countries\Israel\");
fi = dir1.GetFiles("*.gif");

// if you have found any gif files at all
if (fi.Any())
{
    timer1.Enabled = false;
    pictureBox1.Load(fi.Last().FullName);

    listView1.Items[0].Checked = true;
}

然后继续并搜索所有其他子目录,当子目录中有 gif 文件时,请在 listView1 中选中它的复选框。

fi = dir1.GetFiles("*.gif", SearchOption.AllDirectories);

// if you have found any gif files at all
if (fi.Any())
{
    timer1.Enabled = false;

    listView1.Items[0].Checked = true;
}

将这两个代码部分放入您的timer1_Tick 事件中。

您也可以将它们组合成一个 if-else 语句,因为如果您在 Israel 文件夹中找到一个 gif 文件,您的复选框就会被选中。

【讨论】:

  • 也许我也可以不使用计时器来做到这一点?我会提出一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
相关资源
最近更新 更多