Скопируйте папку программным способом без разрешения жестких ссылок в Windows (Win32 API) - PullRequest
1 голос
/ 14 сентября 2011

Я хочу скопировать всю папку без разрешения жестких ссылок

пример:

Folder1
  |
  +---File1
      File2
      HardLink3 -> File3

(HardLink3 создан с использованием fsutil hardlink create или mklink)

Iхотите скопировать эту папку в

Folder2
  |
  +---File1
      File2
      HardLink3 -> File3

, сохраняя Folder2 \ HardLink3 в качестве жесткой ссылки, указывающей на File3

Есть ли вызов Win32 API для копирования всей папки с этой семантикой или, если янужно делать CopyFile / CreateHardLink файл за файлом, что вызов API, чтобы проверить, является ли данный файл жесткой ссылкой или нет?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Если вы абсолютно уверены, что это именно то, что вы хотите сделать, самый простой способ определить, есть ли в файле несколько ссылок (т. Е. «Жесткая ссылка»), вероятно, GetFileInformationByHandle.

Возвращаемое значение nNumberOfLinks будет 1 для обычного файла и больше 1, если файл имеет (или имеет) жесткую ссылку.

Если я правильно понял ваш сценарий, он может быть более разумнымпроверить, жестко ли связан файл с одним из определенного набора файлов (файлы в «общей папке»), а не жестко ли он связан с каким-либо файлом где-либо.Для этого посмотрите идентификатор файла (nFileIndexHigh и nFileIndexLow), который для жесткой ссылки такой же, как и для исходного файла.

В последнем случае в качестве оптимизации вы можете использовать GetFileInformationByHandleEx с опцией FileIdBothDirectoryInfo для чтения имен и идентификаторов файлов для всех файлов в данном каталоге за одну операцию.

2 голосов
/ 14 сентября 2011

Я не думаю, что есть вызов Win32 API, чтобы сделать то, что вы хотите, все за один раз, поэтому вам, вероятно, нужно сделать это вручную.

Проверка, является ли файл жесткой ссылкой или нет, вероятно, не то, что вы хотите сделать. Если файл не является символической ссылкой, каталогом (или точкой повторной обработки или какой-либо другой непонятной вещью), это фактически жесткая ссылка, то есть имя файла указывает на сохраненный файл на диске. Таким образом, если два файла указывают на одни и те же данные, они оба являются жесткими ссылками на этот файл.

В любом случае, Win32-методы для перечисления всех жестких ссылок на файл - это FindFirstFileNameW и FindNextFileNameW.

...