我正在处理以下代码:
枚举源目录和目标目录并生成 {
src
,dst
} 对...每一对都被发送到一个工作线程池
...执行工作,例如“复制
src
到dst
”
(所有这些都被简化了很多)。
问题:
创建文件时,它还会获得一个短名称,该短名称可以与源目录中的另一个文件相同(名称冲突),这会导致各种效果(取决于操作顺序)。例如,复制两个文件my file
并MYFILE~1
可以在目标中生成 2 个或 1 个文件(取决于您的运气),可能包含损坏的内容(在后一种情况下)。
问题:
如何避免此类碰撞产生的问题?有一个函数可以创建/打开忽略短名称的文件会很好......
笔记:
不能假设任何关于短名称的生成方式。不同的系统采用不同的方案(见这个)
即使您以顺序方式(一个接一个)运行这些作业——它们也需要按顺序执行,这取决于短名称生成逻辑(这是未知的)。另外,这意味着在运行任何作业之前在内存中加载和排序/等整个目录
源和目标都可能非常大(可能是数百万个文件),(如果可能的话)我想避免将整个目录加载到内存中或多次枚举它
无法关闭目标卷中的短名称生成并将其作为要求不是一种选择(另外,将其关闭也不会删除现有的短名称)
应用程序仅限于 Win32 API 和 NT API
编辑:在我看来,在一般情况下,即使所有事情都发生在一个线程上,您也无法做到这一点——仅仅是因为无论您选择什么顺序,都会有一个短名称生成方案和一组保证产生的文件名处理过程中的碰撞。
如果这是正确的 - 系统实用程序如何复制文件?在复制完成后,他们是否假设一些关于短名称的内容或执行“验证和修复差异”?