Как проверить, указывают ли два имени файла на один и тот же физический файл - PullRequest
8 голосов
/ 11 января 2010

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

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

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

Ответы [ 5 ]

12 голосов
/ 11 января 2010

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

9 голосов
/ 11 января 2010

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

3 голосов
/ 11 января 2010

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

0 голосов
/ 11 января 2010

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

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

stat -c %i filename

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

stat -c %N filename

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

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

0 голосов
/ 11 января 2010

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

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