Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

TFileStream 


ev   (2002-03-11 19:42) [0]

Подскажите, как грамотно завершить cеанс работы с TFileStream?
Т.е. я создаю файл, записываю в него, а потом?

"Free" плохо работает...



MBo   (2002-03-11 19:45) [1]

достаточно Free.
А насколько плохо? ;)



ev   (2002-03-11 19:51) [2]

У меня постоянно пишется данные (блоками).
Каждый блок: Create (открыть и дописать) - Write - Free.

При зависании системы или неожиданной перезагрузке все данные (с момента запуска программы) теряются.

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



Anatoly Podgoretsky   (2002-03-11 20:19) [3]

Create, Write, Free, пауза до краха сколько?
При Free все данные записываются и файл закрывается, но данные на диск записываются с задержкой, все ли данные у тебя пропадают или только за несколько последних секунд.



MBo   (2002-03-11 20:31) [4]

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



Макс Черных   (2002-03-11 23:36) [5]

>MBo
Да хоть текстовый файл, хоть не текстовый. Хоть 100 потоков
с любым приоритетом. Дисковому кэшу OC (Smartdrive - в ДОСе),
а равно буферу самого НЖМД все это совершенно по барабану.



Stexen   (2002-03-12 00:06) [6]

я незнаю че тама делаетсья на процедуру фрии но я всегда еще сперва ему делал FileClose(FS.HAndle). правдо фрии потом моно не делать я так делале потому что юзать сразу нескоко файлов приходилось и поэтому вот так делал что б время не траить на креате



Anatoly Podgoretsky   (2002-03-12 00:16) [7]

Stexen © (12.03.02 00:06)
Это документировано в описании деструктора Destroy, именно закрытие указателя.



MBo   (2002-03-12 05:02) [8]

>Макс Черных
дело не только в кэше, но и в закрытии файла



ev   (2002-03-12 15:54) [9]

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



Alx2   (2002-03-12 15:59) [10]

Сам не пробовал, но вдруг поможет FlushFileBuffers?


The FlushFileBuffers function clears the buffers for the specified file and causes all buffered data to be written to the file.

BOOL FlushFileBuffers(

HANDLE hFile // open handle to file whose buffers are to be flushed
);



ev   (2002-03-12 16:27) [11]

Спасибо попробую......

Есть еще идеи?



Макс Черных   (2002-03-12 17:02) [12]

>MBo
>дело не только в кэше, но и в закрытии файла
При чем тут закрытие файла? Может попробуете
привести какие нибудь аргументы?

>ev ©
Есть несколько способов решения проблемы:
1. Указанный Alx2 ©, т.е. FlushFileBuffers.
2. Открытие файла с помощью CreateFile c флагом FILE_FLAG_NO_BUFFERING
3. Запрещение кэширования записи Windows, так делает
по умолчанию Windows 2000 server

Может есть и другие способы, но я лично о них ничего не
слышал.



ev   (2002-03-12 23:02) [13]

Так если дело в кэше, то пропадет последние несколько записей (а не одна). Но у меня пропадает весь сеанс?!?!?!?



Макс Черных   (2002-03-12 23:24) [14]

Windows динамически управляет размером кэша.
Например, при наличии 64 Мб ОЗУ, что по нынешним меркам
не так уж и много, размер кэша будет как минимум 4Мб.
А это наверняка много больше нескольких записей БД.
Даже при самой плотной загрузке на 32 Мб ОЗУ, размер кэша
будет минимум 1 Мб. Большинство современных винтов имеет
буфер как минимум 512Кб, а зачастую больше. Так что выводы
делайте сами.



MBo   (2002-03-13 08:06) [15]

>При чем тут закрытие файла? Может попробуете
>привести какие нибудь аргументы?

сходная проблема
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1015949526&n=3



ev   (2002-03-13 12:49) [16]

дополение: пропадает - это при перезагрузке срулвыл находит ошибки и обрезает файлы!




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.023 c
6-80631           Delphimun             2002-01-07 11:39  2002.03.25  
Как отослать почту без использования VCL?


1-80559           Анастасия             2002-03-08 13:14  2002.03.25  
Как заставить таймер считать время назад?


4-80714           Dr Dredd              2001-12-02 22:30  2002.03.25  
Как заморозить комп?


1-80490           BlankAlex             2002-03-12 10:43  2002.03.25  
Обработка OnUpdateError


1-80530           Darkwin               2002-03-13 10:31  2002.03.25  
TMemoryStream