![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как защититься от совместного досупа к файлу в данном случае? [D6, XP]
новый новичок © (2007-11-26 14:26:00)Здравствуйте.
Есть приложение которое время от времени открывает, считывает и записывает числа в/из файла. Вот значит, написал код........
AssignFile(F, CCODir+'\cco'+IntToStr(i)+'.im');
{$I-}
Reset(F);
{$I+}
if IOResult = 0 then begin
//Доступен
CloseFile(F);
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , true);
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , false);
DeleteFile (CCODir+'\cco'+IntToStr(i)+'.im');
end else begin
//Недоступен
CloseFile(F);
end;
И вот когда я попадаю в блок "ФАЙЛ ДОСТУПЕН" и в этот же момент времени идёт какое-то обращение к файлу CCODir+'\cco'+IntToStr (i)+'.a',у меня программа вылетает с ошибкой. Если пользоваться блоком try...except.... вот так вот..........
AssignFile(F, CCODir+'\cco'+IntToStr(i)+'.im');
{$I-}
Reset(F);
{$I+}
if IOResult = 0 then begin
//Доступен
CloseFile(F);
try
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , true);
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , false);
DeleteFile (CCODir+'\cco'+IntToStr(i)+'.im');
except
exit;
end;
end else begin
//Недоступен
CloseFile(F);
end;
то я могу только выйти из процедуры, а файл CCODir+'\cco'+IntToStr (i)+'.a' должен быть обязательно перезаписан, а CCODir+'\cco'+IntToStr (i)+'.im' - удалён. Порекомендуйте пожалуйста, как выкрутиться?
Gydvin (2007-11-27 15:34:00) [1]
> ...и MoveFile - тоже функция.
Именно и она сама по себе возвращает результат выполнения
Virgo_Style (2007-11-27 15:21:00) [2]> новый новичок (27.11.07 07:08) [11]
...и MoveFile - тоже функция.
Leonid Troyanovsky (2007-11-27 10:52:00) [3]
> новый новичок (27.11.07 07:08) [11]
> Пасибо парни.... выкрутился......вот что у меня получилось.
Оч. плохо.
Для возбуждения исключений в MoveFile нужно еще постараться.
И, чего это за обработка - exit.
--
Regards, LVT.
новый новичок (2007-11-27 07:08:00) [4]Пасибо парни.... выкрутился......вот что у меня получилось...
function SaveToAFile () : boolean;
begin
try
result :=true;
MoveFile (PChar(CCODir+'\cco'+IntToStr(bug)+'.im'), PChar(CCODir+'\cco'+IntToStr (bug)+'.a'));
except
exit;
end;
result :=false;
end;
А вот так вызов.....
AssignFile(F, CCODir+'\cco'+IntToStr(bug)+'.im');
{$I-}
Reset(F);
{$I+}
if IOResult = 0 then begin
//Доступен
CloseFile(F);
while SaveToAFile () do sleep (10);
end else begin
//Недоступен
CloseFile(F);
end;
Можно закрывать обсуждение и сохранять в базе... на будущее потомкам -)))
Gydvin (2007-11-26 20:34:00) [5]Чесно говоря код не смотрел, ибо лень.
Но как вариант. Можно блок записи чтения вынести в отдельные функции, которые бы вслучае удачи или не удачи возвращали информацию об этом.
Сам блок фнутри функции заключить в try..except c досрочным фыходом. А к самой функции обращаться циклично.
Чет типа так.
Function SaveFile ():boolean;
begin
result:=true;
try
// код записи
except
// в случае исключения өыход
end;
result:=false;
end;
....
while SaveFile() do sleep ();
...
Virgo_Style (2007-11-26 20:02:00) [6]Как теперь выглядит код?
новый новичок (2007-11-26 19:40:00) [7]На предмет как обойти ошибку совместного доступа к файлу.
Virgo_Style (2007-11-26 19:22:00) [8]> новый новичок (26.11.07 18:37) [6]
> Может есть идеи или соображения?
На предмет чего?
новый новичок (2007-11-26 18:37:00) [9]-((((((((((( Парни, ничего у меня не получается -(((((((
Virgo_Style - спасибо MoveFile - гораздо удобнее. Я чё то даже как то не знал про него.
Может есть идеи или соображения?
Virgo_Style (2007-11-26 14:57:00) [10]Чем, кстати, MoveFile не подошло?
aik (2007-11-26 14:43:00) [11]
If not FileExists(CCODir+'\cco'+IntToStr(i)+'.im') then
ShowMessage('Net Faila') else
Begin
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , true);
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , false);
DeleteFile (CCODir+'\cco'+IntToStr(i)+'.im');
end;
Так немного просто
Virgo_Style (2007-11-26 14:40:00) [12]1. AssignFile-CloseFile, мягко говоря, не нужны.
2. Два CopyFile с одинаковыми параметрами, кроме крайнего - на зачем??
3. CopyFile - это функция.
4. Цикл repeat подойдет.
новый новичок (2007-11-26 14:35:00) [13]Вот такой вот целиком кусочек кода (p.s. вроде не очень большой)....
for i :=1 to 5 do begin
List:=TStringList.Create;
List.LoadFromFile(CurrentDir+'\chas.ini');
State :=List.Values[IntToStr(i)+'State'];
with TImage.Create(Self) do
begin
Top :=i;
Left :=100+x;
Width :=57;
Height :=57;
Name :='CCO'+IntToStr (i);
if State = '0' then Picture.LoadFromFile('E:\Student\IMAGE\COMPBLUE.BMP');
if State = '1' then Picture.LoadFromFile('E:\Student\IMAGE\COMPGREE.BMP');
if State = '3' then begin
TempStr := IntToStr(i)+'State='+State;
index :=List.IndexOf(TempStr);
TempStr := List.Names[index];
List.Values[TempStr] := '0';
List.SaveToFile(CurrentDir+'\chas.ini');
Picture.LoadFromFile('E:\Student\IMAGE\COMPBLUE.BMP');
AssignFile(F, CCODir+'\cco'+IntToStr(i)+'.im');
// ShowMessage (CCODir+'\cco'+IntToStr(i)+'.im');
{$I-}
Reset(F);
{$I+}
if IOResult = 0 then begin
//Доступен
CloseFile(F);
try
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , true);
CopyFile (PChar(CCODir+'\cco'+IntToStr(i)+'.im'),PChar(CCODir+'\cco'+IntToStr (i)+'.a') , false);
DeleteFile (CCODir+'\cco'+IntToStr(i)+'.im');
except
exit;
end;
end else begin
//Недоступен
CloseFile(F);
end;
end;
PopupMenu :=PopupMenu1;
x :=x + 80;
onContextPopup :=My;
Parent :=Self;
end;
List.Free;
end;
новый новичок (2007-11-26 14:31:00) [14]Т.е. как бы этот блок снова выполнить что ли.... Иначе у меня объект дальше в программе не создасться.