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

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

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

  • Метод должен продолжать работать, когда поддержка файловой системы (мягкий или твердый) связывается
  • Полномочия файла исправлены, и только требуется, что первый файл читаем и второй записываемый файл
  • Это должно предпочтительно быть независимо от платформы (хотя Linux является основной целью),
8
задан Gio 11 January 2010 в 13:31
поделиться

5 ответов

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

12
ответ дан 5 December 2019 в 07:11
поделиться

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

9
ответ дан 5 December 2019 в 07:11
поделиться

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

0
ответ дан 5 December 2019 в 07:11
поделиться

Хотя это возможно при использовании сценариев пользовательского интерфейса, для этого также требуется доступ к вспомогательным устройствам (Системные настройки - > Универсальный доступ). Это не кажется правильным, потому что если пользователь предпочитает отключенный доступ, это просто не сработает. Если требуется изменить параметры настройки прокси-сервера, можно использовать SystemConfiguration .framework напрямую, пройдя необходимую проверку подлинности.

-121--4817976-

@ Тео Subversion не сохраняет целую новую копию файла фотошопа с каждой версией. На самом деле это кажется очень эффективным в сохранении типичных обновлений во время работы над дизайном.

Этот опыт основан на моем личном опыте... но воспроизводится другими: http://joshcarter.com/productivity/svn_hg_git_for_home_directory

Остерегайтесь Version Cue, потому что это создаст среду adobe-программного обеспечения, где каждый должен установить творческий номер люкс, чтобы получить доступ к вашим файлам (по крайней мере, вам придется использовать Adobe Bridge). С другой стороны, существует множество веб-серверов субверсии на основе opensource, которые предоставят всем членам вашей команды доступ к вашей работе с помощью простого браузера (включая rss-канал).

И я настоятельно рекомендую прочитать ссылку, предоставленную @ balexandre «The Ultimate Guide to Version Control for Designer»

-121--4693682-

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

В bash, вы просто вызываете:

stat -c %i filename

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

stat -c %N filename

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

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

-1
ответ дан 5 December 2019 в 07:11
поделиться

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

3
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: