Я имею дело с кодом, который:
перечисляет исходные и целевые каталоги и генерирует {src
, dst
} пар
... каждая пара отправляется в пул рабочих потоков
..., который выполняет работу, например "копировать src
в dst
"
(все это несколько упрощено).
Проблема:
Когда файл создается, он также получает короткое имя, которое может бытьтакой же, как другой файл в исходном каталоге (конфликт имен), что приводит к различным эффектам (в зависимости от порядка операций).Например, копирование двух файлов my file
и MYFILE~1
может привести к получению 2 или 1 файла в месте назначения (в зависимости от вашей удачи), возможно, с поврежденным содержимым (в последнем случае).
Вопрос:
Как избежать проблем, возникающих при таких столкновениях?Было бы неплохо иметь функцию, которая создает / открывает файл, игнорируя короткие имена ...
Примечания:
не может ничего предположить оспособ создания короткого имени.Различные системы используют разные схемы (см. this )
, даже если вы выполняете эти задания последовательно (по одному) - их необходимо выполнитьв порядке, который зависит от логики генерации короткого имени (которая неизвестна).Кроме того, это подразумевает загрузку и сортировку всего каталога / etc в памяти перед выполнением каких-либо заданий
и источник, и адресат могут быть очень большими (потенциально миллионы файлов), (если возможно), я бы хотелчтобы избежать загрузки всего каталога в память или его многократного перечисления
не может отключить генерацию короткого имени в томе назначения и сделать его обязательным требованием не вариант (плюс, отключение нене удаляйте существующие имена в любом случае)
приложение ограничено только Win32 API и NT API
Редактировать: itМне пришло в голову, что в общем случае вы не можете сделать это, даже если все происходит в одном потоке - просто потому, что независимо от выбранного вами порядка, будет схема генерации коротких имен и набор имен файлов, которые гарантированно вызовут конфликт во времяобработка.
Если это правильно - как системные утилиты копируют файлы?Предполагают ли они что-нибудь о коротких именах или выполняют «проверку и исправление расхождений» после завершения копирования?