Как определить, указывают ли два URI файловой системы на один и тот же ресурс? - PullRequest
3 голосов
/ 12 мая 2009

Если у меня есть два разных пути к файлу, как я могу определить, указывают ли они на один и тот же файл?

Это может иметь место, если, например, к пользователю подключен сетевой диск, который указывает на некоторый сетевой ресурс. Например, диск S: сопоставлен с \ servercrm \ SomeFolder.

Тогда эти пути фактически указывают на один и тот же файл:

S:\somefile.dat

И

\\servercrm\SomeFolder\somefile.dat

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

Ответы [ 3 ]

3 голосов
/ 12 мая 2009

Я не знаю, есть ли простой способ сделать это непосредственно в C #, но вы могли бы сделать неуправляемый вызов GetFileInformationByHandle (pinvoke page здесь ), который вернет BY_HANDLE_FILE_INFORMATION структура. Он содержит три поля, которые можно объединить для однозначной идентификации файла:

dwVolumeSerialNumber: Серийный номер тома, содержащего файл.

...

nFileIndexHigh: Старшая часть уникального идентификатора, связанная с файл.

nFileIndexLo: Младшая часть уникального идентификатора, связанная с файл.

Идентификатор (младшая и старшая части) и серийный номер тома однозначно определяют файл на одном компьютере. Чтобы определить, представляют ли два открытых маркера один и тот же файл, объедините идентификатор и серийный номер тома для каждого файла и сравните их.

Обратите внимание, что это работает, только если обе ссылки объявлены с одного и того же компьютера.


Отредактировано, чтобы добавить:

В соответствии с этим вопросом это может не сработать в вашей ситуации, так как dwVolumeSerialNumber может отличаться, если определения общих ресурсов различны. Сначала я попробовал бы это, так как я всегда думал, что серийный номер тома зависит от конкретного диска, а не от конкретного пути. Хотя мне никогда не нужно было это доказывать, поэтому я могу быть (и, вероятно, ошибаюсь).

1 голос
/ 12 мая 2009

По крайней мере, вы можете взять и сравнить MD5-хэши объединенного содержимого файла, имени файла и метаданных, таких как CreationTime, LastAccessTime и LastWriteTime.

0 голосов
/ 12 мая 2009

Если вас беспокоит только локальные файлы, вы можете использовать комбинацию GetFileInformationByHandle и структуры BY_HANDLE_FILE_INFORMATION. Лучан сделал отличную запись в блоге на эту тему здесь. Код находится в VB.Net, но он должен быть легко конвертируемым в C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...