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

Вниз

Окончание записи в файл   Найти похожие ветки 

 
snake1977   (2003-05-14 08:53) [0]

Здравствуйте !!
подскажите ктонибудь, как определить, что файл полностью записан и больше ни кем не используется?
есть такой исх. код:
Procedure save;
var ini:TINIFile;
f:File of Byte;
Begin
ini:=TINIFile.Create("log.ini");
ini.WriteString("main","path",ExtractFilePath(ParamStr(0)));
ini.WriteString("main","programm",ExtractFilename(ParamStr(0)));
....
{тут еще порядка 15 строк записи в ini}
....
ini.Free;
AssignFile(f,"log.ini");
reset(f); //вот тут и косяк :( , потому что размер фала = от 0 до 15 байт


т.е. в 98 винде (для ХР все нормально)файл получается не дописаным до конца после вызова метода free для объекта ini.
как определить что процесс записи завершен ??


 
MBo   (2003-05-14 09:02) [1]

проще всего, видимо, попробовать открыть в монопольном режиме.


 
snake1977   (2003-05-14 09:06) [2]

как его открыть в монопольном режиме?


 
MBo   (2003-05-14 09:09) [3]

Например, FileOpen и File open mode constants


 
snake1977   (2003-05-14 09:29) [4]

неработает :(
открыл в fmShareExclusive все равно происходит открытие еще недописанного системой файла


 
MBo   (2003-05-14 09:32) [5]

TIniFile.UpdateFile


 
Verg   (2003-05-14 09:40) [6]

Можно подожать окончания всех операций и закрытия файла с помощью нехитрой операции:
if renamefile("log.ini","log.ini") then <процесс записи завершен>


 
snake1977   (2003-05-14 09:40) [7]

точно! заработала :)
но в принципе вопрос остается, как на самом деле определить что файл например открытый другой программой, на самом деле дописан до конца?


 
Palladin   (2003-05-14 09:44) [8]

спросить у другой программы


 
snake1977   (2003-05-14 10:05) [9]

>> Palladin
очень умно,
просто оборжаться можно.
А как ? не подскажеш?? блесни знаниями


 
snake1977   (2003-05-14 10:23) [10]

>>Verg
неработает :(
я пробовал поставить в цикле while not renameFile("log.ini","log.ini") do r:=sin(0.33323);
все равно программа открывает еше не дописанный до конца файл.

может быть как то можно вызвать системную функцию, сброса буфферов файлов на диск, или что то в этом духе ??


 
MBo   (2003-05-14 10:25) [11]

а UpdateFile, по-твоему, чем занимается?



 
snake1977   (2003-05-14 10:29) [12]

UpdateFile это ежели я его сам открыл :)
а например в системе функционирует две программы, одна из которых записывает в файл, а другая читает из него, тогда UpdateFile не сработает


 
Palladin   (2003-05-14 10:31) [13]

а я не шутил, где смешно?


 
Verg   (2003-05-14 10:40) [14]


> while not renameFile("log.ini","log.ini") do r:=sin(0.33323);


Ну, во-первых, такие циклы делать не рекомендуется,
while not renameFile("log.ini","log.ini") do sleep(0);

Во-вторых, все зависит от того каким именно образом другая программа занимается записью в файл, т.е., если, например она открывает файл - дописывает кусок- закрывает файл, и так столько раз, сколько она считает нужным, то нет никакого способа определит, дописала ли она все что хотела или нет.

Если же, запись происходит по принципу открыли файл-записали все, что хотели-закрыли файл, то комбинация
while not (fileexists(fname) and renamefile(fname, fname)) do sleep(0) (можно и application.processmessages);

определяет завершение записи в файл и его закрытие стопудово.


 
snake1977   (2003-05-14 10:49) [15]

>>Palladin
Просто Ваш "ответ" поражает информативностью, все равно что на вопрос "где Вы живете?" Вы ответили бы "в городе" :)


 
Anatoly Podgoretsky   (2003-05-14 10:58) [16]

snake1977 (14.05.03 10:49)
А какой ответ интересует - планета, страна, город, улица, квартира или может еще что другое.
Ответ на этот вопрос знает только программа, занимающияся записью. Нормально для многопрограммной среды не использовать ресурс долше чем нудно.


 
Palladin   (2003-05-14 11:01) [17]

и был бы прав.
меня много чего поражает в твоем вопросе
определить с 100% точностью что запись в файл другой программой завершена (что не есть тоже самое, что целостность данных в нем соблюдена) только тогда когда файл будет закрыт "той" программой...
если файл открыт, то естественно никакой гаранитии тебе никто не даст...
звучал бы вопрос по другому "как мне организовать передачу данных между двумя моими программами" тебе было бы предложено множество других вариантов, но в такой формулировке 3 варианта
1 ждать пока закроется файл
2 переодически считывать и сравнивать с предыдущим содержанием находя изменения
3 если вдруг, может быть, по счастливой случайности, по доброте писавших ее программистов, "та" программа умеет сообщать что она закончила запись, то вывод сам собой напраивается, узнать каким образом она умеет это сообщать, и принимать сообщения


 
snake1977   (2003-05-14 11:11) [18]

>>Palladin
...
>>...звучал бы вопрос по другому "как мне организовать передачу данных между двумя моими программами" тебе было бы предложено множество других вариантов

ежелиб это были две мои программы, то вопроса бы и не возникло :)

>>1 ждать пока закроется файл
как узнать что другая программа его закрыла???
и как узнать что все буфферы этого файла записаны на диск??

>>2 переодически считывать и сравнивать с предыдущим содержанием находя изменения
невозможно , потому нельзя узнать является ли изменение конечным. например программа записала в файл строку "мама мыла раму" но на самом деле в файле еще только "мама мы"

>>3 если вдруг, может быть, по счастливой случайности, по доброте писавших ее программистов....
сам понимаеш таих случайностей небывает :)



 
Palladin   (2003-05-14 11:20) [19]


> как узнать что другая программа его закрыла???

попробуй открыть в режиме записи и узнаешь как


> и как узнать что все буфферы этого файла записаны на диск??

никак


 
Anatoly Podgoretsky   (2003-05-14 11:23) [20]

snake1977 (14.05.03 11:11)

>>1 ждать пока закроется файл
Это уже лучше, единственный метод открыть монопольно.

Palladin © (14.05.03 11:20)
Программа может разрешать запись в файл и в тоже время он открыт.


 
snake1977   (2003-05-14 11:39) [21]

>> Anatoly Podgoretsky
уже пробовал :)
snake1977 (14.05.03 09:29)
неработает :(
открыл в fmShareExclusive все равно происходит открытие еще недописанного системой файла

пробовал и fmShareExclusive or fmOpenRead
все отлично открывается, но размер = 0
:(





 
snake1977   (2003-05-14 11:41) [22]

>> Anatoly Podgoretsky
дело в том что другая программа могла его открыть как угодно, в том числе разрешить его чтение и запись :)


 
Palladin   (2003-05-14 11:51) [23]

тогда только второй вариант, с ожиданием изменения



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

Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
1-83588
vsu
2003-05-14 13:20
2003.05.26
RxLoginDialog и с чем его едят


1-83603
a413
2003-05-13 15:15
2003.05.26
Пропал IDLE


3-83408
Jaxtor
2003-05-06 14:00
2003.05.26
Вопрос по проектированию БД


4-83811
OxOTHuK
2003-03-29 07:41
2003.05.26
PID окна


14-83672
pavel_k
2003-05-05 21:34
2003.05.26
Assembler лит-ра и инфа





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