【问题标题】:Detecting a sequence of files检测文件序列
【发布时间】:2010-07-22 18:11:35
【问题描述】:

我需要将文件序列导入 Qt 程序。导入本身并不难,但我正在考虑检测文件是否形成序列的最简单方法,例如:

filename_00001.png
filename_00002.png
filename_00003.png
etc.

现在,我有一个拖放导入工作,我正在按字母顺序对导入文件的列表进行排序。但是在遍历 QUrl/QString 时,我正在努力寻找一种“简单”的解决方案来检测图像编号。我可以遍历文件名,找到字符串中的第一个数字,形成基本字符串,计数器+可能的填充和结束字符串并尝试匹配这些。然而,这听起来有点太乱了,让我觉得一定有更好的方法。但是有吗?

【问题讨论】:

  • IMO 你已经做的是最简单的解决方案。我建议您继续使用它,而不是遵循差异方法。而且它听起来并不像你想象的那样混乱..

标签: c++ string qt


【解决方案1】:

我的直觉告诉我,任何解决方案本质上都会涉及到您刚才描述的内容。它可能基于 sscanf、正则表达式或直接字符串比较,但方法必须基本相同。

请问目标是什么?

【讨论】:

  • 它应该是一个简单的框架,可以在上面尝试图像过滤器。图像序列来自各种来源,例如定格动画装置。我打算只阅读序列,对它们运行过滤器并将它们显示在屏幕上。
【解决方案2】:

您描述的最有可能是最简单的解决方案。

如果您希望应用程序中的代码行数更少,那么QRegEx 就是解决方案。

【讨论】:

  • 您能详细说明您的 QRegEx 解决方案吗?
【解决方案3】:

我可以遍历文件名,找到字符串中的第一个数字,形成基本字符串,计数器 + 可能的填充和结束字符串并尝试匹配这些。然而,这听起来有点太乱了,让我觉得一定有更好的方法。但是有吗?

我想要一个简单的解决方案,因此我牺牲了内存并使用多个列表/映射来对名称进行排序/分组。我将字符串打包到带有额外字段的结构中以获取辅助信息。

我正在使用一个特殊的比较功能。它并不完全是 const,因为除了比较字符串之外,它还为每个条目提取并保存一个 prefix。 (实际上我是在比较 CVS 风格的文件版本,在我的例子中,前缀是分支的 id,序列是文件的相邻版本。)

它就是这样工作的。输入文件列表:

"filename_00001.png"
"filename_00002.png"
"filename_00003.png"

第一条扩展:

"filename_00001", "png"
"filename_00002", "png"
"filename_00003", "png"

然后在排序期间从文件名前缀中提取:名称 - 末尾的所有数字。如果前缀相等,则比较数字。 (在我的情况下,输入没有用零填充):

"filename_00001", "png", "filename_"
"filename_00002", "png", "filename_"
"filename_00003", "png", "filename_"

排序/前缀提取后,所有序列都具有相同的前缀。如果文件末尾没有数字,则整个文件名是一个前缀,并且根据定义它是唯一的。您还可以额外保存提取的号码:

"filename_00001", "png", "filename_", 1
"filename_00002", "png", "filename_", 2
"filename_00003", "png", "filename_", 3

现在它们都已正确排序和排序,辅助信息已准备好-所有进一步的操作都相当琐碎。例如。遍历列表,可以使用简单的规则提取所有序列:前缀相同/seq num 与 prev 条目相比 +1。

IOW,这可能与您所做的没有太大区别。我根本不害怕在操作上投入一点内存/CPU,因为按照它们的文件操作无论如何都会更慢/更多的内存占用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多