Как проверить, указывают ли два имени файла на один и тот же физический файл

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

Ограничения:

  • Метод должен продолжать работать, когда файловая система поддерживает (мягкие или жесткие) ссылки
  • Права доступа к файлам фиксированы, и требуется только, чтобы первый файл был доступен для чтения, а второй файл - для записи.
  • Желательно, чтобы он был нейтральным к платформе (хотя Linux является основной целью)

6 ответов

Решение

В Linux откройте оба файла и используйте fstat проверить, если st_ino (редактировать:) и st_dev подобные. open будет следовать символическим ссылкам. Не использовать stat непосредственно, чтобы предотвратить условия гонки.

Лучше всего не использовать имена файлов в качестве идентификаторов. Вместо этого, когда вы открываете файл для чтения, заблокируйте его, используя любой механизм, поддерживаемый вашей ОС. Когда вы затем откроете файл для записи, также заблокируйте его - если блокировка не удалась, сообщите об ошибке.

Если возможно, откройте первый файл только для чтения ( O_RDONLY) в LINUX. Затем, если вы попытаетесь открыть его снова, чтобы написать в него, вы получите ошибку.

Если вы имеете в виду тот же индексный дескриптор, в bash вы можете сделать

[ FILE1 -ef FILE2 ] && echo equal || echo difference

В сочетании с realpath/ readlink, который также должен обрабатывать софт-ссылки.

Вы можете использовать stat, чтобы получить статус файла и проверить, совпадают ли номера инодов.

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

В bash вы просто позвоните:

stat -c %i filename

Это показывает номер индекса файла. Вы можете сравнить два файла таким образом, и если их inode идентичны, это означает, что они являются жесткими ссылками. Следующий звонок:

stat -c %N filename

отобразит имя файла и, если это символическая ссылка, напечатает имя файла, на который он ссылается. Он печатает только одно имя, даже если файл, на который он указывает, имеет жесткие ссылки, поэтому проверка символической ссылки потребует сравнения номеров инодов для 2-го файла и файла, на который ссылаются символические ссылки, чтобы убедиться в этом.

Вы можете перенаправить вывод статистики в текстовый файл, а затем проанализировать файл в вашей программе.

Другие вопросы по тегам