Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд….
Давайте подумаем, что произойдет, если к одному и тому же файлу одновременно обратятся несколько процессов, с целью записать туда какую-либо информацию? Могу сразу ответить: часть, либо вся информация, хранящаяся в файле будет безвозвратно потеряна. И просто блокировкой файла здесь не обойтись.
Такая задача встала передо мной при написании скрипта каталога для обмена ссылками LinkExchanger. Информация там должна была храниться именно в файлах. В итоге получилась вот такая функция, код которой приведен ниже…
Давайте разберем очень подробно, как это работает.
Функция WriteToFile принимает два аргумента: путь к файлу, в который будет записана информация и собственно информация, представленная в виде массива. Нам понадобятся еще два файла, пути к которым определяются константами PATH_BLOCKFILE и PATH_TEMPFILE. Собственно из названий понятно, что первый – это некий блокирующий файл, а второй – файл для временного хранения информации.
Функция WriteToFile принимает два аргумента: путь к файлу, в который будет записана информация и собственно информация, представленная в виде массива. Нам понадобятся еще два файла, пути к которым определяются константами PATH_BLOCKFILE и PATH_TEMPFILE. Собственно из названий понятно, что первый – это некий блокирующий файл, а второй – файл для временного хранения информации.
Первое, что мы делаем – открываем на запись блокирующий файл. Далее ставим на него блокировку, и если эта операция прошла успешно, открываем на запись временный файл, в который и пишем нашу информацию.
Закрываем временный файл, удаляем исходный файл и переименовываем временный файл, давая ему имя исходного. Далее снимаем блокировку с блокирующего файла и закрываем его.
Это все. Проверено годами работы в условиях массового использования и на самых различных хостингах.
Единственное, за чем надо следить, чтобы при добавлении информации не было превышено допустимое дисковое пространство.
Закрываем временный файл, удаляем исходный файл и переименовываем временный файл, давая ему имя исходного. Далее снимаем блокировку с блокирующего файла и закрываем его.
Это все. Проверено годами работы в условиях массового использования и на самых различных хостингах.
Единственное, за чем надо следить, чтобы при добавлении информации не было превышено допустимое дисковое пространство.
http://www.linkexchanger.su/2008/10.html
Комментариев нет:
Отправить комментарий