![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему глючит определение размера файла [D6, Win2k]
ev © (2002-02-22 21:49:00)Этот блок выполняется каждые 2 секунды. В файл 2 раза в секунду пишутся данные (по 20 КБ).
f:=TFileStream.Create("d:\exp.dat",(fmOpenRead or fmShareDenyNone));
size:=f.Size;
f.Free;
Почему (иногда) переменная sizeдва раза подряд содержит одинаковые значения?
Проверял - запись в файл была!
Юрий Зотов (2002-02-28 19:19:00) [1]Здесь - нигде, надо менять код Stream"а в VCL. Но делать это, конечно, ни к чему.
Попробуйте отказаться от использования FileStream, а вместо него пишите через напрямую через API (CreateFile, WriteFile...). Тогда все в Ваших руках - можно и любые флаги выставить, и FlushFileBuffers вызывать после каждого изменения. Только с FILE_FLAG_NO_BUFFERING аккуратнее - внимательно прочитайте хелп.
И еще. Похоже, Вы ловите изменения файла. Но ловить их по таймеру плохо, надо использовать FindFirst/Next/CloseChangeNotification.
troits (2002-02-28 19:11:00) [2]Видимо, придется писать потомка TFileStream, где перекрыть конструктор Create.
.....
Handle := Integer(CreateFile(PChar(FileName), .... FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0));
ev (2002-02-28 18:37:00) [3]
fdb:=TFileStream.Create("d:\file.db",(fmOpenReadWrite or fmShareDenyWrite));
где изменить FILE_FLAG_NO_BUFFERING (не нашел) ?
Юрий Зотов (2002-02-28 18:30:00) [4]Попробуйте FlushFileBuffers. Но боюсь, что вызывать ее придется в контексте пишущего процесса - то есть, возможно, потребуется правка исходников и перекомпиляция пишущей программы. Если это доступно, то можно попробовать также изменить флаги файла сразу при его открытии - см. FILE_FLAG_NO_BUFFERING и пр. в описании CreateFile. Вообще, пишущая программа Ваша или нет?
ev (2002-02-28 17:53:00) [5]и как с этим бороться?
Юрий Зотов (2002-02-28 17:45:00) [6]> В файл 2 раза в секунду пишутся данные (по 20 КБ).
И это обновление система сбрасывает на диск не сразу, а когда решит, что пора. Кэширование, однако...
ev (2002-02-28 17:42:00) [7]не помогло :(
что еще попробовать....
Vitaly Nevzorov (2002-02-23 00:35:00) [8]Попробуй добавить после открытия потока переход позиции чтения на конец потока(seek).