Закінчення записи в файл

Закінчення записи в файл

Добрий день.
підкажіть хто-небудь, як визначити, що файл повністю записаний і більше ні ким не використовується?
є такий вих. код:
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)));
.

.
ini.Free;
AssignFile (f, "log.ini");
reset (f); // ось тут і косяк :(. Тому що розмір фала = від 0 до 15 байт


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

найпростіше, мабуть, спробувати відкрити в монопольному режимі.

як його відкрити в монопольному режимі?

Наприклад, FileOpen і File open mode constants

не працює :(
відкрив в fmShareExclusive все одно відбувається відкриття ще недописаний системою файлу

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

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

запитати в іншої програми

>> Palladin
дуже розумно,
просто оборжаться можна.
А як. НЕ підкажеш. Заблищи знаннями

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

може бути як то можна викликати системну функцію, скидання буффер файлів на диск, або що то в цьому дусі.

а UpdateFile, по-твоєму, чим займається?

UpdateFile це якщо я його сам відкрив :)
а наприклад в системі функціонує дві програми, одна з яких записує в файл, а інша читає з нього, тоді UpdateFile не спрацює

а я не жартував, де смішно?


> 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);

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

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

snake1977 # 032; (14.05.03 10:49)
А яку відповідь цікавить - планета, країна, місто, вулиця, квартира або може ще що інше.
Відповідь на це питання знає тільки програма, які опікуються записом. Нормально для многопрограммной середовища не використовувати ресурс долше ніж нудно.

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

ежеліб це були дві мої програми, то питання б і не виникло :)

>> 1 чекати поки закриється файл
як дізнатися що інша програма його закрила.
і як дізнатися що все буффер цього файлу записано на диск.

>> 3 якщо раптом, може бути, завдяки щасливому випадку, по доброті писали її програмістів.
сам розумієш таіх випадковостей не буває :)


> Як дізнатися що інша програма його закрила.

спробуй відкрити в режимі запису і дізнаєшся як


> І як дізнатися що все буффер цього файлу записано на диск.

ніяк

snake1977 # 032; (14.05.03 11:11)

>> 1 чекати поки закриється файл
Це вже краще, єдиний метод відкрити монопольно.

>> Anatoly Podgoretsky
вже пробував :)
snake1977 (14.05.03 09:29)
не працює :(
відкрив в fmShareExclusive все одно відбувається відкриття ще недописаний системою файлу

пробував і fmShareExclusive or fmOpenRead
все відмінно відкривається, але розмір = 0
:(

>> Anatoly Podgoretsky
справа в тому що інша програма могла його відкрити як завгодно, в тому числі дозволити створювати його вміст :)

тоді тільки другий варіант, з очікуванням зміни

Схожі статті