【问题标题】:Read in a directory from a given file point in C++从 C++ 中的给定文件点读取目录
【发布时间】:2013-03-11 21:01:05
【问题描述】:

我有两个程序将同时读取/写入文件到同一个目录(但不是同时读取相同的确切文件)。我已经完成了写作部分,但我正在努力实现阅读目录部分的一半体面和工作实施。

目录中的文件遵循以下命名方案: Image-[INDEX]-[KEY/DEL]--[TIMESTAMP]

[INDEX]000000 递增,[KEY/DEL] 根据图像是键还是增量帧交替变化,[TIMESTAMP] 是文件创建时的 Unix/Linux 纪元时间。

现在,读取程序每次需要在目录中查找图像时,一次读取目录中的一个文件(使用dirent.h 库)。当目录变得非常大时,我想这个操作/方法会很快变得非常耗费资源,并最终失败。所以,我正在尝试寻找一种替代方法。我正在考虑在初始化时读取整个目录,并将文件信息保存在一个数组中,以便稍后在程序中访问/使用。然后,当请求一个不在数组中的文件时,程序将通过读取目录来更新文件数组,但这一次从初始化结束时停止的点开始。

这可能吗?在目录中的已知点(最后一个文件“读入”)开始读取目录中的文件名?还是我每次都必须从头开始?

或者有更好的方法吗?

谢谢。

【问题讨论】:

  • 您是否有任何证据表明“当目录变得非常大时,我想这种操作/方法将很快变得非常耗费资源”?我目前在亚秒时间内处理一个目录中的 90k 个文件...
  • 不能保证最后会有新的目录条目,所以这个方法不起作用。但是,您可以同时使用inotifyreaddir(在调用opendir 之前先调用inotify_add_watch)。
  • @AndrewWhite 我很想知道您是否曾经在 NTFS 卷上尝试过。
  • @WhozCraig:答案是否定的。我只在 ext4 文件系统上做过这个
  • @AndrewWhite 我想我唯一的证据是通过图形界面,但事实并非如此。您正在经历什么样的亚秒级计时。该程序有时需要“读入”大小在 200 毫秒以下的目录。

标签: c++ file directory


【解决方案1】:

正如安德鲁所说,我会在尝试解决之前确认这实际上是一个问题。

如果您可以排除文件被乱序创建的可能性,即没有文件 您希望在该文件之后创建另一个文件之前进行处理,那么您可以使用此方法。

首先,将整个目录列表读入一个数组或vector。然后,在迭代文件时,只需迭代向量。最后,如果找不到文件或到达矢量的末尾,请刷新它以防万一创建了更多文件。

毫无疑问,您会希望将此逻辑封装到某种上下文对象中,该对象会记住上次读取的文件。您还可以通过对向量进行排序来优化。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2015-04-22
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多