![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TerminateProcess
Суслик © (2005-04-25 14:53:00)Добрый день.
Есть такой псевдокод:
... запись в файл 200 мб из памяти
sleep(500);
TerminateProcess(GetCurrentProcess);
Вопрос: почему система ждет, когда файл запишется и только потом приложение закрывается? Вернее, почему файл оказывается записанным?
ЗЫ. win2000 server, диски ntfs и fat32.
alpet (2005-04-26 18:32:00) [41]Sha © (26.04.05 18:19) [95]
> наша приграмма ни при каких условиях сделать этого не могла.
Это понятно. Но другая программа вполне может повредить файл. И жесткий диск может внезапно осыпаться битыми кластерами.
Sha (2005-04-26 18:19:00) [42]> Суслик © (26.04.05 17:57) [92]
Эксперимент (на W2K) подтверждает, что FlushFileBuffers - синхронная операция, и управление к тебе не вернется до завершения записи данных и метаданных на диск:
procedure TSenderForm.Button1Click(Sender: TObject);
var
fi: file;
i: integer;
s: string;
begin
SetLength(s,1024);
AssignFile(fi,'aaa'); Rewrite(fi,1);
for i:=1 to 1024*1024 do BlockWrite(fi,s[1],Length(s));
FlushFileBuffers(TFileRec(fi).Handle);
ShowMessage('ccc');
CloseFile(fi);
end;
Пускаем сие чудо, а файлик смотрим Far'ом.
> alpet © (26.04.05 18:02) [94]
> г) Есть только файл data.txt но он безнадежно поврежден.
наша приграмма ни при каких условиях сделать этого не могла.
alpet (2005-04-26 18:02:00) [43]Sha © (26.04.05 17:58) [93]
Четвертое состояние:
г) Есть только файл data.txt но он безнадежно поврежден.
Как быть?
Sha (2005-04-26 17:58:00) [44]alpet © (26.04.05 17:44) [89]
Возможны 3 состояния:
a) есть только файл data.txt,
б) есть файл data.txt и data.tmp,
в) есть только файл data.tmp.
В случаях а) и б) - правильный файл data.txt.
В случае в) - правильный файл data.tmp. Переименовываем и продолжаем работать.
Суслик (2005-04-26 17:57:00) [45]
> [91] mgcr © (26.04.05 17:53)
таки ты хочешь сказать, что система обо мне сама позаботится, сбой произойдет при FlushFileBuffers, то при сосстановлении система восстановит исходное значение файла?
Не верю, быть такого не может. А если файл 1гб?
Или ты что-то другое имел в виду?
mgcr (2005-04-26 17:53:00) [46]
> Может быть пока идет скидывание комп упадет и не скинется
> до конца - половина новая, половина старая. Где гарантия,
> что этого не будет?
В End-Of-File pointer
alpet (2005-04-26 17:47:00) [47]Суслик © (26.04.05 17:42) [88]
Пока FFB скидывает содержимое буферов на диск - управление не вернется. Если после ее отработки закрыть описатель файла, и создать второй (копию 1:1) и обойтись с ним так же, о наличии сбоя можно будет судить по отсутствию второго файла (до него просто дело не дойдет) либо по наличию отличий между вторым и первым файлом.
alpet (2005-04-26 17:44:00) [48]Sha © (26.04.05 17:38) [86]
2. Как иначе доказать что файл был записан полностью, а не частично?
3. Это только метод перестраховки (вирусы, проблемы с жестким диском).
Суслик (2005-04-26 17:42:00) [49]
> [86] Sha © (26.04.05 17:38)
> > alpet © (26.04.05 17:22) [83]
> Вроде п.п. 2 и 3 лишние
как раз вопрос о транзакционности flushfilebuffer. Может быть пока идет скидывание комп упадет и не скинется до конца - половина новая, половина старая. Где гарантия, что этого не будет?
Sha (2005-04-26 17:41:00) [50]> mgcr © (26.04.05 17:35) [85]
> Был во время оно на ЕС такой продукт Librarian...
> Не знакомо ?
Неа, у меня был свой...
Sha (2005-04-26 17:38:00) [51]> alpet © (26.04.05 17:22) [83]
Вроде п.п. 2 и 3 лишние
mgcr (2005-04-26 17:35:00) [52]Sha © (26.04.05 13:35) [59]
<offtopic>
> > Это я к тому, что цепочечную файловую систему трудно сделать
> надежной
>
> Делал, и даже на ЕС.
Был во время оно на ЕС такой продукт Librarian (отечественный вариант носил название "Ритм") со всякими Jobstream-файлами и аккурат цепочечной организацией внутренних файлов данных, в отличие от экстентной.
Не знакомо ?
</offtopic>
Sha (2005-04-26 17:31:00) [53]Тут важный момент: Close сам не обновляет даннае в оглавлении, а лишь просит ОС сделать это.
Отсюда выводы:
- Выполнение Close не гарантирует обновление метаданных при отключении питания,
- То, что отложеный вызов FlushFileBuffers делает ОС увеличивает быстродействие приложения,
- Самостоятельно вызывая FlushFileBuffers ты обновляешь данные в оглавлении, но проигрываешь в скорости.
alpet (2005-04-26 17:22:00) [54]Маленький итог:
1. Необходимо - сбрасывать данные на жесткий диск принудительно.
Самое простое для этого использовать функцию FFB (FlushFileBuffers).
2. После завершения этой операции создавать дополнительный файл как доказательство что первый уже записался.
3. Дополнительно: Как защиту от непредвиденных ситуаций можно создавать копию первого файла.
Что еще не хватает для решения задачи?
Sha (2005-04-26 17:20:00) [55]> Суслик © (26.04.05 16:51) [80]
Можно проверить
procedure TSenderForm.Button1Click(Sender: TObject);
var
fi: file;
begin
AssignFile(fi,'aaa'); Rewrite(fi,1);
BlockWrite(fi,'bbb',3);
//FlushFileBuffers(TFileRec(fi).Handle);
ShowMessage('ccc');
CloseFile(fi);
end;
Пускаем как есть, OK не говорим.
Под 98 размер файла должен быть 0.
Говорим OK - размер меняется на 3.
Значит метаданные в оглавлении обновляются по Close.
Повторяем с раскомментированным FlushFileBuffers.
Видим, что метаданные обновлены до Close.
Все как ты хотел.
mgcr (2005-04-26 17:01:00) [56]Суслик © (26.04.05 16:23) [78]
> Сохранение раз в 10 минут файла до 3 мб таким образом, чтобы
> при аппаратных сбоях (выключение компьютера) при последующем
> восстановлении либо было понятно, что произошел сбой (т.е.
> новый файл не дописался), либо новый файл дописался и информации
> о сбое нет. В первом случае происходит восстановление старого
> файла
Вообще-то это делает любой редактор, создавая резервную копию. Word, например, создает специальный файл, маленький, в том числе и для этих целей.
Суслик (2005-04-26 16:51:00) [57]
> Если не в сети, то должно может будет достататочно FlushFileBuffers,
> как советовал mgcr ?
Да я тоже так думаю, что достаточно.
Т.е. ты тоже думаешь, что достаточно?
Sha (2005-04-26 16:43:00) [58]Суслик © (26.04.05 16:23) [78]
Если не в сети, то должно может будет достататочно FlushFileBuffers, как советовал mgcr ?
Суслик (2005-04-26 16:23:00) [59]
> [77] mgcr © (26.04.05 16:14)
Да я вроде все объяснил где-то выше.
Дабы не искать повторю:
Сохранение раз в 10 минут файла до 3 мб таким образом, чтобы при аппаратных сбоях (выключение компьютера) при последующем восстановлении либо было понятно, что произошел сбой (т.е. новый файл не дописался), либо новый файл дописался и информации о сбое нет. В первом случае происходит восстановление старого файла.
Т.е. либо все записалось, либо не записалось и откатилось до предыдущего значения с уведомлением о случившемся сбое заинтересованных сторон.
Должно работать в 98 и 2000, на ntfs и fat.
mgcr (2005-04-26 16:14:00) [60]Суслик © (26.04.05 16:09) [76]
> Конкрентый вопрос - делал ли кто-то сам то, что мне нужно
> на win98 и win2000?
А что тебе нужно, ты как гимназистка, объясняешь туманными полунамеками.