Автор Тема: Удаление записей из файла, наиболее безопасный способ?  (Прочитано 6626 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн C++

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 221
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Чтобы удалить записи из файла можно использовать кучу способов, например:
1) записать в новый, потом новый переименовать;
2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;
3) записать в новый файл, обрезать старый, переписать из старого в новый;
4) и т.д.
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.
Какие есть мысли, свои и комментарии к вышеперечисленным способам?
Особенно интересны комментарии к способу под номером 1.

Оффлайн Отец Никон

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
С++, мне кажется, очевидно, что первый способ - самый лучший, т.к. выполняется самое меньшее количество операций.

Оффлайн C++

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 221
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
а при переименовании chmod сохраняется?
еще плиз:)

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
Цитировать

2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;


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

На это время файл желательно залочить, а для больших объемов данных я бы не использовал текстовые файлы как контейнер.
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
1) записать в новый, потом новый переименовать

Цитировать
выполняется самое меньшее количество операций

Это ещё под вопросом. Из старого то файла читать все одно приходится.
Цитировать
обеспечить надлежащую безопасность
Чего?
Все болезни от нервов, только сифилис от удовольствия

Оффлайн C++

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 221
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Цитировать
Цитата:
обеспечить надлежащую безопасность


Чего?


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

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
безопасность данных

При разделяемом доступе к файлу?
Используй flock
Все болезни от нервов, только сифилис от удовольствия

Оффлайн C++

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 221
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
про flock я знаю
интересует утеря информации, к примеру из-за сбоя в системе.
при каком способе это наиболее вероятно?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.

Цитировать
интересует утеря информации, к примеру из-за сбоя в системе.

100% вероятности от сбоя при хранении информации в файле быть не может(!)
Используй базы данных и будешь спать более спокойно.
Насчет варианта #1. Я не понял. а что считать данные из файла и записать туда измененные данные за один заход нельзя? Это и будет наиболее удачный вариант.   Без дерганья дескрипторов файлов, причем на каждом этапе может потенциально быть сбой(это я с точки зрения параноика говорю :) )...Про flock уже сказали.
The documentations is your friend

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
> а что считать данные из файла и записать туда измененные данные за один заход нельзя

Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)? Первый вариант должен быть более безопасным, у нас по крайней мере остается неизмененный файл, а если операция записи нового прошла успешно, тогда мы его переименовываем, а это операция практически мгновенная.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Ты же просто сначала читаешь данные из файла, а потом поверх него записывашь новый, поврежденние данных возможно только когда идет процесс записи...
А если ты хочешь сделать все в один проход то тебе прийдется, как минимум, заблокировать файл, и потом обрабатывать данные... и получится что файл у тебя будет недоступен какое-то время, что само по себе может ривести к тормозам, но с другой стороны, если ты будешь блокировать файл сразу как только прочитал, и разблокировать только после его обновления, ты снизишь до минимума потерю данных...

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
В любом случае
Цитировать
100% вероятности от сбоя при хранении информации в файле быть не может(!)

А жаль!
Все болезни от нервов, только сифилис от удовольствия

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
Цитировать
чтоб ничего не было утеряно или изменены не нужные поля


Это уже зависит от твоего алгоритма проверки на нужность/ненужность данных...

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


Зачем делать несколько действий, когда можно обойтись одним - не зря же люди flock придумали.

Цитировать
Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)?


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

Сколько интересно у вас времени занимает перезапись файла, засеките для интереса... :))) А то бубнеж, какой-то порожняковый, не говоря уже о требованиях к безопасности для хранения данных в текстовых файлах...
« Последнее редактирование: 08 Февраля 2003, 21:16:40 от Wyclef »
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
> интересует утеря информации, к примеру из-за сбоя в системе

> не зря же люди flock придумали

flock придумали для регулирования доступа к файлу разными процессами, причем этим регулированием занимается ОС. От нештатных ситуаций (когда ОС или компьютер вообще повиснет) оно не спасет.

Просили наиболее безопасный способ. Я же не знаю, сколько мегабайт нужно писать. Гарантировать сохранение данных можно только в том случае, если писать в новый файл. Даже если файл всего 10 кб, он уже не поместится на один блок диска (в большинстве случаев) и писать его придется в два захода, а значит повисание системы в этот момент повредит данные.

Если вероятностью этого события можно пренебречь, тогда другое дело, но решать это должны не мы, а автор вопроса.

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
Цитировать
flock придумали для регулирования доступа к файлу разными процессами


При сбое сервера как ранее сказали ничего не спасет, а при попытке клиента повторить в процессе запрос или при нескольких - вполне.

Впору плавно перейти на обсуждение теории вероятности сбоения серверов при попытке изменения 10кб файлов :), только оно то не стоит...

Автор то уже просек тему? Алло?
It\'s nice to be important, but it\'s more important to be nice!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28