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

Вниз

Непрерывная запись в файл   Найти похожие ветки 

 
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.


 
ketmar ©   (2008-02-11 20:42) [41]

>[38] unknowing (2008-02-11 20:38:00)
тебе давно всё рассказали. идёшь и пробуешь.

---
Understanding is not required. Only obedience.


 
guav ©   (2008-02-11 20:45) [42]

> [0] unknowing   (11.02.08 18:52)

Не использовать кэши системы (FILE_FLAG_NO_BUFFERING, FILE_FLAG_WRITE_THROUGH). Писать посекторно или по много секторов, но целое число секторов, в конец каждого сектора пару байт сигнатуры, при чтении её проверять (сравнением с ожидаемым значением), при повторной записи в то же место - изменять. Не смешивать выделение места и запись - это разные операции.
Это используется в NTFS и в CLFS.

Есть специально для подобной задачи Common Log File System (CLFS)
http://msdn2.microsoft.com/en-us/library/bb986747(VS.85).aspx
Сам не использовал реально, только "игрался" с ней, но похоже, что то, что тебе нужно.
Но требуется 2003 сервер или виста.


 
Джо ©   (2008-02-11 20:47) [43]

> [39] clickmaker ©   (11.02.08 20:39)
>
> > [36] Джо ©   (11.02.08 20:36)
>
> у тебя МСДН неправильный )
> есть она и в 98 и в 95 и даже в Win32s под win3.1 )

Какой есть, шел из комплекта VS 2008...


 
Anatoly Podgoretsky ©   (2008-02-11 20:49) [44]

> unknowing  (11.02.2008 20:38:38)  [38]

Короче тебе все рассказали, остались только нюансы функционирования на разных ФС.


 
Джо ©   (2008-02-11 20:52) [45]

Чтобы окончательно добить вопрос с FlushFileBuffers и MSDN, цитирую онлайн-версию:
Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
Теперь просьба к clickmaker"у указать свои источники цитирования ;)


 
unknowing   (2008-02-11 20:54) [46]


> Anatoly Podgoretsky ©   (11.02.08 20:49) [44]

У меня конкретная фс... Короче, кроме CloseFile,  я так понял, ничего путного нет.


 
unknowing   (2008-02-11 21:02) [47]

http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_flushfilebuffers.htm


 
Anatoly Podgoretsky ©   (2008-02-11 21:13) [48]

> Джо  (11.02.2008 20:52:45)  [45]

В MS SDK - Win 95, Win32s


 
Anatoly Podgoretsky ©   (2008-02-11 21:14) [49]

> unknowing  (11.02.2008 20:54:46)  [46]

CloseFile это гарантия.
Я сейчас не могу найти информацию, на поведение при аварийном завершение, но отно отличается в зависимости от ОС и ФС


 
clickmaker ©   (2008-02-12 11:23) [50]


> Теперь просьба к clickmaker"у указать свои источники цитирования

секция экспорта в kernel32.dll )


 
guav ©   (2008-02-12 11:34) [51]

Судя по MSDN, CreateMutex тоже нет в 98 и NT http://msdn2.microsoft.com/en-us/library/ms682411.aspx
Последний MSDN в котором не забили на 95/98/NT был April 2007


 
guav ©   (2008-02-12 11:36) [52]

Я бы таки предпочёл задать размер файла заранее, затем использовать FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH.
В этом случае после возврата WriteFile данные будут записаны. Время модификации не гарантируется, но оно не так важно


 
Джо ©   (2008-02-12 12:00) [53]

> [51] guav ©   (12.02.08 11:34)
> Судя по MSDN, CreateMutex тоже нет в 98 и NT http://msdn2.microsoft.com/e
> n-us/library/ms682411.aspx
> Последний MSDN в котором не забили на 95/98/NT был April
> 2007

Offtop. Блин, как-раз неделю назад его снес и поставил от VS 2008 :(


 
clickmaker ©   (2008-02-12 12:07) [54]


>  [53] Джо ©   (12.02.08 12:00)

не все МСДНы одинаково полезны )


 
Slym ©   (2008-02-12 12:46) [55]

не проще бесперебойник купить?


 
guav ©   (2008-02-12 12:56) [56]

> [53] Джо ©   (12.02.08 12:00)

У меня оба прекрасно сосуществуют. Старого на всякий случай ещё одну копию прожёг :)
Кстати, его пока ещё можно скачать http://www.microsoft.com/downloads/details.aspx?familyid=B8704100-0127-4D88-9B5D-896B9B388313&displaylang=en


 
Джо ©   (2008-02-12 13:31) [57]

> [56] guav ©   (12.02.08 12:56)
> > [53] Джо ©   (12.02.08 12:00)
>
> У меня оба прекрасно сосуществуют. Старого на всякий случай
> ещё одну копию прожёг :)
> Кстати, его пока ещё можно скачать http://www.microsoft.com/downloads/det
> ails.aspx?familyid=B8704100-0127-4D88-9B5D-896B9B388313&displaylang=en

Спасибо, обязательно восстановлю удаленный, потому как это не дело...


 
MBo ©   (2008-02-12 13:55) [58]

Пиши кусочки в небольшие файлы, потом вместе соберешь


 
unknowing   (2008-02-13 17:54) [59]

Вот результаты работы:
1. Периодичный FlushFileBuffers():
   - под NTFS & WinXP - порядик, потери данных не возникает;
   - под FAT32 & WinME - фиаско, все пропало, потеря данных.
2. Непрерывный CloseFile():
   - под NTFS & WinXP - порядик, потери данных не возникает;
   - под FAT32 & WinME - порядик, потери данных не возникает.


 
ketmar ©   (2008-02-13 17:57) [60]

>[59] unknowing (2008-02-13 17:54:00)
тем, кто живёт на FAT — не привыкать к геморрою.

---
Understanding is not required. Only obedience.


 
unknowing   (2008-02-13 18:02) [61]


> ketmar ©   (13.02.08 17:57) [60]

В моем случае можно интерпретировать так: "тем,кто бедно живет - не превыкать к геморрою"


 
ketmar ©   (2008-02-13 18:19) [62]

>[61] unknowing (2008-02-13 18:02:00)
да ну. я почти уверен, что хорошо обработаный напильником Win2k на вашу технику встанет и заработает вполне нормлально. если уж не совсем доисторическое 486.

---
Understanding is not required. Only obedience.


 
unknowing   (2008-02-13 18:24) [63]


> ketmar ©   (13.02.08 18:19) [62]

Встанет, но туго очень!


 
ketmar ©   (2008-02-13 18:27) [64]

>[63] unknowing (2008-02-13 18:24:00)
а напильничком потом? сервисы лишние поотрывать, морду попилять?

---
Understanding is not required. Only obedience.


 
unknowing   (2008-02-13 18:33) [65]


> ketmar ©   (13.02.08 18:27) [64]

WinMe быстрее всяко на том ноуте. Есть умельцы по обрезанию ХР, но по стравнию с ВинМе медленнее


 
ketmar ©   (2008-02-13 18:36) [66]

>[65] unknowing (2008-02-13 18:33:00)
ну, тогда сиди на бочке с динамитом. %-)

---
Understanding is not required. Only obedience.



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

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

Наверх




Память: 0.63 MB
Время: 0.024 c
11-1184740909
max727
2007-07-18 10:41
2008.03.09
Снова KOLWord


15-1202120566
asdfa
2008-02-04 13:22
2008.03.09
не могу понять как запускается файл


2-1202557076
MySQLProgrammer
2008-02-09 14:37
2008.03.09
Извлечение данных из TDataSource


8-1175498564
Jar
2007-04-02 11:22
2008.03.09
Используемый кодек


4-1184532413
Eugem
2007-07-16 00:46
2008.03.09
Работа с модемом