Форум: "Основная";
Текущий архив: 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]дополение: пропадает - это при перезагрузке срулвыл находит ошибки и обрезает файлы!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c