【问题标题】:Get next file in the folder获取文件夹中的下一个文件
【发布时间】:2014-11-09 20:20:08
【问题描述】:

当您在 Windows 照片查看器中打开图片时,您可以使用箭头键在支持的文件之间来回导航(下一张照片/上一张照片)。

问题是:给定文件夹中当前文件的路径,如何获取下一个文件的路径?

【问题讨论】:

  • 我很确定在幕后它是文件夹中所有文件的列表,然后是获取列表中的下一个项目的问题。我猜是因为每次都查询文件系统效率不是很高
  • 获取所有路径到一个集合中,添加一个从0开始的计数器并递增/递减计数器以获得下一个/上一个路径。
  • 如果文件夹包含大量文件,这将是一个相当缓慢的过程,不是吗?也许还有另一种指定的方式。

标签: c# file directory system.io.directory


【解决方案1】:

您可以通过将所有路径放入一个集合并保留一个计数器来轻松完成此操作。如果您不想将所有文件路径加载到内存中,您可以使用Directory.EnumerateFilesSkip 方法来获取下一个或上一个文件.例如:

int counter = 0;

string NextFile(string path, ref int counter)
{
    var filePath = Directory.EnumerateFiles(path).Skip(counter).First();
    counter++;
    return filePath;
}

string PreviousFile(string path, ref int counter)
{
    var filePath = Directory.EnumerateFiles(path).Skip(counter - 1).First();
    counter--;
    return filePath;
}

当然你需要一些额外的检查,例如在NextFile你需要检查你是否到达最后一个文件,你需要重置计数器,同样在PreviousFile你需要确保计数器不是@ 987654326@,如果是则返回第一个文件等。

【讨论】:

  • 对于目录中的每个文件,我不推荐使用 EumerateFilesSkip 调用这种方法。这将非常低效,特别是对于具有大量文件的目录。
  • 这似乎效率不高,也没有回答我们应该如何从列表中间开始,就像用户在文件夹中间打开图像时一样......
【解决方案2】:

鉴于您对给定文件夹中的大量文件感到担忧,并希望按需加载它们,我建议您采用以下方法 -

(注意 - 在另一个答案中调用 Directory.Enumerate().Skip... 的建议有效,但效率不高,特别是对于具有大量文件的目录,以及其他一些原因)

// Local field to store the files enumerator;
IEnumerator<string> filesEnumerator;

// You would want to make this call, at appropriate time in your code.
filesEnumerator = Directory.EnumerateFiles(folderPath).GetEnumerator();

// You can wrap the calls to MoveNext, and Current property in a simple wrapper method..
// Can also add your error handling here.
public static string GetNextFile()
{
    if (filesEnumerator != null && filesEnumerator.MoveNext())
    {
        return filesEnumerator.Current;
    }

    // You can choose to throw exception if you like..
    // How you handle things like this, is up to you.
    return null;
}

// Call GetNextFile() whenever you user clicks the next button on your UI.

编辑:当用户移动到下一个文件时,可以在链接列表中跟踪以前的文件。 逻辑基本上看起来像这样 -

  1. 使用链接列表进行上一个和下一个导航。
  2. 在初始加载或点击Next时,如果链表或其下一个节点为空,则使用上面的GetNextFile方法,找到下一个路径,显示在UI上,并将其添加到链接中列表。
  3. 对于Previous,使用链表标识之前的路径。

【讨论】:

  • 你打算如何获取以前的文件?
  • @Selman22 感谢您的评论。我已经更新了我的答案。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2011-06-20
  • 2021-09-04
  • 2012-08-23
  • 1970-01-01
  • 2020-06-07
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多