Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1192783481
alsov
2007-10-19 12:44
2008.03.09
Поиск по blob полю


2-1202754186
Patric
2008-02-11 21:23
2008.03.09
Автоматизация процесса


2-1202839610
Igor23
2008-02-12 21:06
2008.03.09
апостроф


3-1192461796
Kinder
2007-10-15 19:23
2008.03.09
Как отличить тип колонки int от float


15-1202038145
Галинка
2008-02-03 14:29
2008.03.09
Вопрос к преподавателям





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский