Главная страница
    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.


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

Наверх





Память: 0.61 MB
Время: 1.166 c
15-1201900320
ProgRAMmer Dimonych
2008-02-02 00:12
2008.03.09
Подскажите, плз, направление поиска


15-1202111721
Valentina_HR
2008-02-04 10:55
2008.03.09
поомгите найти программиста Delphi!!! (Санкт-Петербург)


2-1202994122
Konst5719
2008-02-14 16:02
2008.03.09
Tray (Taskbar Notification Area)


2-1202482584
Costia
2008-02-08 17:56
2008.03.09
как правельно работатать с indy


2-1202739868
patrick1968
2008-02-11 17:24
2008.03.09
Проблема с написанием Service а





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