Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.14;
Скачать: CL | DM;

Вниз

Почему глючит определение размера файла   Найти похожие ветки 

 
ev ©   (2002-02-22 21:49) [0]

Этот блок выполняется каждые 2 секунды. В файл 2 раза в секунду пишутся данные (по 20 КБ).

f:=TFileStream.Create("d:\exp.dat",(fmOpenRead or fmShareDenyNone));
size:=f.Size;
f.Free;

Почему (иногда) переменная size два раза подряд содержит одинаковые значения?
Проверял - запись в файл была!


 
Vitaly Nevzorov ©   (2002-02-23 00:35) [1]

Попробуй добавить после открытия потока переход позиции чтения на конец потока(seek).


 
ev ©   (2002-02-28 17:42) [2]

не помогло :(

что еще попробовать....


 
Юрий Зотов ©   (2002-02-28 17:45) [3]

> В файл 2 раза в секунду пишутся данные (по 20 КБ).

И это обновление система сбрасывает на диск не сразу, а когда решит, что пора. Кэширование, однако...


 
ev ©   (2002-02-28 17:53) [4]

и как с этим бороться?


 
Юрий Зотов ©   (2002-02-28 18:30) [5]

Попробуйте FlushFileBuffers. Но боюсь, что вызывать ее придется в контексте пишущего процесса - то есть, возможно, потребуется правка исходников и перекомпиляция пишущей программы. Если это доступно, то можно попробовать также изменить флаги файла сразу при его открытии - см. FILE_FLAG_NO_BUFFERING и пр. в описании CreateFile. Вообще, пишущая программа Ваша или нет?


 
ev ©   (2002-02-28 18:37) [6]


fdb:=TFileStream.Create("d:\file.db",(fmOpenReadWrite or fmShareDenyWrite));


где изменить FILE_FLAG_NO_BUFFERING (не нашел) ?


 
troits ©   (2002-02-28 19:11) [7]

Видимо, придется писать потомка TFileStream, где перекрыть конструктор Create.

.....
Handle := Integer(CreateFile(PChar(FileName), .... FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0));


 
Юрий Зотов ©   (2002-02-28 19:19) [8]

Здесь - нигде, надо менять код Stream"а в VCL. Но делать это, конечно, ни к чему.

Попробуйте отказаться от использования FileStream, а вместо него пишите через напрямую через API (CreateFile, WriteFile...). Тогда все в Ваших руках - можно и любые флаги выставить, и FlushFileBuffers вызывать после каждого изменения. Только с FILE_FLAG_NO_BUFFERING аккуратнее - внимательно прочитайте хелп.

И еще. Похоже, Вы ловите изменения файла. Но ловить их по таймеру плохо, надо использовать FindFirst/Next/CloseChangeNotification.



Страницы: 1 вся ветка

Текущий архив: 2002.03.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
3-42931
roottim
2002-02-14 16:55
2002.03.14
список таблиц из аксеса


3-42972
--Reporter--
2002-02-12 23:27
2002.03.14
Проблема с record size в Firebird 0.9.4


1-43054
Hewlping
2002-02-26 17:09
2002.03.14
ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!


1-43026
Olezh
2002-02-26 13:10
2002.03.14
Пожалуйста помогите!...


1-43014
pusrg
2002-02-28 20:29
2002.03.14
Изначальное масштабирование в QuickReport