короткие имена и параллельное копирование файлов - PullRequest
0 голосов
/ 16 ноября 2018

Я имею дело с кодом, который:

  • перечисляет исходные и целевые каталоги и генерирует {src, dst} пар

  • ... каждая пара отправляется в пул рабочих потоков

  • ..., который выполняет работу, например "копировать src в dst"

(все это несколько упрощено).

Проблема:

Когда файл создается, он также получает короткое имя, которое может бытьтакой же, как другой файл в исходном каталоге (конфликт имен), что приводит к различным эффектам (в зависимости от порядка операций).Например, копирование двух файлов my file и MYFILE~1 может привести к получению 2 или 1 файла в месте назначения (в зависимости от вашей удачи), возможно, с поврежденным содержимым (в последнем случае).

Вопрос:

Как избежать проблем, возникающих при таких столкновениях?Было бы неплохо иметь функцию, которая создает / открывает файл, игнорируя короткие имена ...

Примечания:

  • не может ничего предположить оспособ создания короткого имени.Различные системы используют разные схемы (см. this )

  • , даже если вы выполняете эти задания последовательно (по одному) - их необходимо выполнитьв порядке, который зависит от логики генерации короткого имени (которая неизвестна).Кроме того, это подразумевает загрузку и сортировку всего каталога / etc в памяти перед выполнением каких-либо заданий

  • и источник, и адресат могут быть очень большими (потенциально миллионы файлов), (если возможно), я бы хотелчтобы избежать загрузки всего каталога в память или его многократного перечисления

  • не может отключить генерацию короткого имени в томе назначения и сделать его обязательным требованием не вариант (плюс, отключение нене удаляйте существующие имена в любом случае)

  • приложение ограничено только Win32 API и NT API

Редактировать: itМне пришло в голову, что в общем случае вы не можете сделать это, даже если все происходит в одном потоке - просто потому, что независимо от выбранного вами порядка, будет схема генерации коротких имен и набор имен файлов, которые гарантированно вызовут конфликт во времяобработка.

Если это правильно - как системные утилиты копируют файлы?Предполагают ли они что-нибудь о коротких именах или выполняют «проверку и исправление расхождений» после завершения копирования?

1 Ответ

0 голосов
/ 16 ноября 2018

M., Если вы хотите отключить файл shorname, вы можете предпринять следующие шаги:

  1. Найти ключ в реестре: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem
  2. установить значение «NtfsDisable8dot3NameCreation» равным 1, 1 означает отключить короткое имя файла, а 0 означает включить короткое имя.
...