Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
ВнизНепрерывная запись в файл Найти похожие ветки
← →
unknowing (2008-02-11 18:52) [0]Всем привет! У меня следующаяя проблема: с СОМ-порта непрерывно приходят данные, которые я записываю в файл. В случае остановки записи программой (CloseFile) или выхода из программы все нормально. Интересует ситуация когда пропадает питание и комп выключается: файл не записывается на диск... Как защищаться от такой ситуации?
← →
Джо © (2008-02-11 18:56) [1]Если ОС >= Win 2003, то можно время от времени вызывать FlushFileBuffers для записи внутреннего буфера на диск принудительно.
Если же ОС < 2003, то, наверное, периодически нужно переоткрывать файл (закрыть и снова открыть).
Проблема с дисковым кэшем ОС остается открытой и, вероятно, нерешимой.
← →
Palladin © (2008-02-11 18:57) [2]ну так и пиши не в буффер, а в файл... если уж на уровне файловой системы данные могут пропасть, то эта проблемма программно нерешаема... только установкой дизельного генератора
← →
unknowing (2008-02-11 18:58) [3]
> Джо © (11.02.08 18:56) [1]
> Если же ОС < 2003, то, наверное, периодически нужно переоткрывать
> файл (закрыть и снова открыть).
Тяжелый для меня вариант, т.к. и так уже с логикой в программе накручено...
А ос - winME
← →
unknowing (2008-02-11 19:00) [4]
> Palladin © (11.02.08 18:57) [2]
> ну так и пиши не в буффер, а в файл... если уж на уровне
> файловой системы данные могут пропасть, то эта проблемма
> программно нерешаема... только установкой дизельного генератора
Пример, если не трудно, как "писать не в буфер, а сразу в файл"
← →
Palladin © (2008-02-11 19:01) [5]Var
f:File;
n:Integer;
Begin
n:=10;
AssignFile(f,"file1"); Rewrite(f,1);
BlockWrite(f,n,SizeOf(n));
CloseFile(f);
End;
← →
unknowing (2008-02-11 19:03) [6]
> Palladin © (11.02.08 19:01) [5]
я так и делаю, только CloseFile после каждой записи себе не позволяю....
← →
Palladin © (2008-02-11 19:11) [7]хочешь максимальной сохранности принятых данных - придется. где ты вообще видел скорость приема COM порта быстрее чем запись даже на ту 3.5 дискету.
← →
unknowing (2008-02-11 19:19) [8]
> Palladin © (11.02.08 19:11) [7]
Я от выключения компьютера защищаюсь. Завтра испытания, а ноутбук у меня с поломанной батареей. Испытания ~ 4 часа непрерывно, если в конце питание пропадет - писец, все пропало :(
← →
ketmar © (2008-02-11 19:30) [9]попробовать режим WRITETHRU (см. help по CreateFile() ).
---
Understanding is not required. Only obedience.
← →
clickmaker © (2008-02-11 19:32) [10]
> [1] Джо © (11.02.08 18:56)
> Если ОС >= Win 2003, то можно время от времени вызывать
> FlushFileBuffers
???
Client Requires Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
(c) MSDN
← →
unknowing (2008-02-11 19:35) [11]
> clickmaker © (11.02.08 19:32) [10]
Дома МСДН не держу.. :( Завтра на работе гляну. Спасибо!
← →
ketmar © (2008-02-11 19:37) [12]>[11] unknowing (2008-02-11 19:35:00)
>Дома МСДН не держу
в интернетах выложено, да.
---
Understanding is not required. Only obedience.
← →
Anatoly Podgoretsky © (2008-02-11 19:38) [13]Только закрытие/открытие файла гарантирует его целостность.
← →
unknowing (2008-02-11 19:40) [14]
> Anatoly Podgoretsky © (11.02.08 19:38) [13]
Ясно. А жаль!.. Но, к сожалению, в случае с закрытием придется всю программную логику перерыть, а это не вариант
← →
clickmaker © (2008-02-11 19:42) [15]
> [13] Anatoly Podgoretsky © (11.02.08 19:38)
> Только закрытие/открытие файла гарантирует его целостность
зависит от структуры.
Если есть некий check-point, то периодический flush - вполне себе решение
← →
unknowing (2008-02-11 19:44) [16]
> clickmaker © (11.02.08 19:42) [15]
а flush после каждой записи вариант?
← →
clickmaker © (2008-02-11 19:46) [17]
> [16] unknowing (11.02.08 19:44)
ну грубо говоря, нужно определить минимальную значимую единицу информации, порцию то есть.
Н-р, одна строка. Или один экземпляр структуры. После записи которой делать flush.
← →
unknowing (2008-02-11 19:51) [18]
> clickmaker © (11.02.08 19:46) [17]
Ясно! Так как инженеры до информации жадны, то flush после каждой записи - это вариант! :)
← →
Anatoly Podgoretsky © (2008-02-11 19:55) [19]> clickmaker (11.02.2008 19:42:15) [15]
flush не гарантия.
← →
clickmaker © (2008-02-11 19:57) [20]
> [19] Anatoly Podgoretsky © (11.02.08 19:55)
почему?
← →
unknowing (2008-02-11 19:57) [21]
> Anatoly Podgoretsky © (11.02.08 19:55) [19]
Ну, основная часть данных сохраниться? Фиг с ней, с текущей, важно весь длительный запуск не потерять. Или и здесь не гарантируется?
← →
ketmar © (2008-02-11 20:01) [22]что, write thru никто не пробовал? а я надеялся, что мне расскажут, подходит ли оно. ладно, не вышло. %-)
---
Understanding is not required. Only obedience.
← →
clickmaker © (2008-02-11 20:03) [23]
> [22] ketmar © (11.02.08 20:01)
нафига оно под пингвином? там fflush() есть )
← →
Anatoly Podgoretsky © (2008-02-11 20:06) [24]> clickmaker (11.02.2008 19:57:20) [20]
Потому что запись в каталог производится после закрытия файла, а НТФС к тому же журналируемая система. Иногда производится промежуточная запись, но ничего не гарантируется.
Гарантируется только FlushFileBuffers flushes this file"s buffers. и более ничего, функция по сути полезна, только для коммуникационных устройств и именованых трубопроводов.
← →
unknowing (2008-02-11 20:09) [25]
> Ну, основная часть данных сохраниться? Фиг с ней, с текущей,
> важно весь длительный запуск не потерять. Или и здесь не
> гарантируется?
← →
clickmaker © (2008-02-11 20:11) [26]
> Потому что запись в каталог производится после закрытия
> файла
да щас.
Запись производится после вызова FlushFileBuffers или после WriteFile, если файл был открыт с флагом FILE_FLAG_NO_BUFFERING
Для слежение за логами во время работы программы очень полезно.
А иначе - да, только после закрытия файла увидишь
← →
Anatoly Podgoretsky © (2008-02-11 20:13) [27]> clickmaker (11.02.2008 20:11:26) [26]
Журналирование может испортить всю картину.
А насчет переделки программы, много ли мест, где производится запись, ничтожно мало.
← →
clickmaker © (2008-02-11 20:15) [28]
> [27] Anatoly Podgoretsky © (11.02.08 20:13)
> > clickmaker (11.02.2008 20:11:26) [26]
>
> Журналирование
да причем тут журналирование?
в вопросе даже про NTFS ни слова нет.
Суть в том, что периодически промывая буфера, можно бОльшую часть сохранить. Что-то потеряется, но значительно меньше, чем если вообще не сбрасывать до вызова CloseFile
← →
clickmaker © (2008-02-11 20:17) [29]
> да причем тут журналирование?
> в вопросе даже про NTFS ни слова нет.
тем более, что [3]
> А ос - winME
← →
unknowing (2008-02-11 20:18) [30]
> Anatoly Podgoretsky © (11.02.08 20:13) [27]
Если на счет переделки программы имелась в виду моя программа, то место где производится запись одно, но вот только много с этим местом связано логических всяких штук и жуть как не хочется переделывать все..
← →
Anatoly Podgoretsky © (2008-02-11 20:21) [31]> clickmaker (11.02.2008 20:15:28) [28]
Тут Рипли нам нужна, расставить точки на И
← →
clickmaker © (2008-02-11 20:24) [32]
> [31] Anatoly Podgoretsky © (11.02.08 20:21)
так Рипли по линолеуму не специализируется, вроде ж как?
она ж по MFT в NTFS )
← →
Anatoly Podgoretsky © (2008-02-11 20:28) [33]> clickmaker (11.02.2008 20:24:32) [32]
Поведение конечно может различаться, но и общего много.
А WinMe я как то пропустил, не заметил.
← →
clickmaker © (2008-02-11 20:30) [34]да-да. У ФАТ и НТФС охрененно много общего.
Вот тут Рипли нужна, она в курсе )
← →
ketmar © (2008-02-11 20:33) [35]>[34] clickmaker © (2008-02-11 20:30:00)
>У ФАТ и НТФС охрененно много общего.
физический носитель, например. %-)
---
Understanding is not required. Only obedience.
← →
Джо © (2008-02-11 20:36) [36]>
> [10] clickmaker © (11.02.08 19:32)
> ???
> Client Requires Windows XP, Windows 2000 Professional, Windows
> NT Workstation, Windows Me, Windows 98, or Windows 95.
>
> (c) MSDN
У меня написано так:
Client
Requires Windows Vista, Windows XP, or Windows 2000 Professional.
MSDN Build date: 8/15/2007
← →
clickmaker © (2008-02-11 20:37) [37]
> [35] ketmar © (11.02.08 20:33)
> >[34] clickmaker © (2008-02-11 20:30:00)
> >У ФАТ и НТФС охрененно много общего.
> физический носитель, например
ну дык. Булат Окуджава и Карлос Сантана - оба гитаристы o)
← →
unknowing (2008-02-11 20:38) [38]Ребята, короче, с моим-то вопросом конкретно что?
← →
clickmaker © (2008-02-11 20:39) [39]
> [36] Джо © (11.02.08 20:36)
у тебя МСДН неправильный )
есть она и в 98 и в 95 и даже в Win32s под win3.1 )
← →
ketmar © (2008-02-11 20:42) [40]>[37] clickmaker © (2008-02-11 20:37:00)
а то! правда, первый играет вечную музыку, а второй какую-то попсу по типу black magic woman. %-)
---
Understanding is not required. Only obedience.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.043 c