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