Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
3-42985
Sparky
2002-02-13 12:59
2002.03.14
MIDAS Удаление записи


3-42973
Di_wind
2002-02-13 20:23
2002.03.14
Access +Delphi+DAO


7-43202
AndrewInc
2001-12-13 16:50
2002.03.14
Как перезагрузить Windows NT


1-43083
KvORubin
2002-02-26 15:42
2002.03.14
TRichEdit - ПОМОГИТЕ !!!


1-43090
Eugie
2002-02-27 13:41
2002.03.14
Изменение цвета компонентов и шрифта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский