У меня есть программа, которая принимает два имен файлов как аргументы: это читает первый файл для создания второго файла. Как я могу удостовериться, что программа не перезапишет первый файл?
Ограничения:
На Linux, откройте как файлы, так и используйте fstat
, чтобы проверить, если ST_ino
(редактирование :) и st_dev
одинаковы. Открыто
, следуют за символическими ссылками. Не используйте Stat
напрямую, чтобы предотвратить гоночные условия.
Лучший вариант - не использовать имена файлов в качестве идентификационных данных. Вместо этого, когда вы открываете файл для чтения, заблокируйте его, используя любой механизм, поддерживаемый вашей операционной системой. Когда вы также откроете файл для записи, также заблокируйте его - если блокировка не удастся, сообщите об ошибке.
Хотя это возможно при использовании сценариев пользовательского интерфейса, для этого также требуется доступ к вспомогательным устройствам (Системные настройки - > Универсальный доступ). Это не кажется правильным, потому что если пользователь предпочитает отключенный доступ, это просто не сработает. Если требуется изменить параметры настройки прокси-сервера, можно использовать 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 в текстовый файл, а затем проанализировать файл в программе.
Если возможно, откройте первый файл только для чтения, ( O_RDONLY ) в Linux. Затем, если вы попытаетесь открыть его снова, чтобы написать ему, вы получите ошибку.