我需要将文件序列导入Qt程序。导入本身并不难,但我在思考什么是检测文件是否形成序列的最简单方法,例如:
filename_00001.png
filename_00002.png
filename_00003.png
etc.
现在,我有一个drag'n'drop导入工作,我按字母顺序排序导入文件列表。但是在迭代QUrl / QString时,我正在努力寻找一种“简单”的解决方案来检测图像编号。我可以通过迭代文件名,找到字符串中的第一个数字,形成基本字符串,计数器+可能的填充和结束字符串并尝试匹配这些。然而,这听起来有点过于混乱,让我觉得必须有更好的方法。但是有吗?
答案 0 :(得分:0)
我的直觉会告诉我,任何解决方案都会涉及到你刚刚描述的内容。它可能基于sscanf,正则表达式或直接字符串比较,但方法必须基本相同。
请问目标是什么?
答案 1 :(得分:0)
您最有可能描述的是最简单的解决方案。
如果您想在应用中使用较少的代码行,那么QRegEx就是解决方案。
答案 2 :(得分:0)
我可以通过迭代文件名,找到字符串中的第一个数字,形成基本字符串,计数器+可能的填充和结束字符串并尝试匹配这些。然而,这听起来有点过于混乱,让我觉得必须有更好的方法。但是有吗?
我想要有简单的解决方案,因此我牺牲了内存并使用多个列表/地图来排序/分组名称。我将字符串打包到带有额外字段的结构中以获取辅助信息。
我正在使用特殊的比较功能。它不是精确的const,因为它与比较字符串一起还为每个条目提取并保存前缀。 (实际上我正在比较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
现在它们都已正确排序和排序,辅助信息已准备就绪 - 所有进一步的操作都相当简单。例如。迭代列表,可以用简单的规则提取所有序列:前缀与prev参数相同/ seq num是+1。
IOW,它可能与你的工作没什么不同。我只是不害怕在操作上抛出一点内存/ CPU,因为跟随它们文件操作的速度越来越慢/内存越来越大。