Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
ВнизКак защититься от совместного досупа к файлу в данном случае? Найти похожие ветки
← →
новый новичок (2007-11-26 14:26) [0]Здравствуйте.
Есть приложение которое время от времени открывает, считывает и записывает числа в/из файла. Вот значит, написал код........
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" - удалён. Порекомендуйте пожалуйста, как выкрутиться?
← →
новый новичок (2007-11-26 14:31) [1]Т.е. как бы этот блок снова выполнить что ли.... Иначе у меня объект дальше в программе не создасться.
← →
новый новичок (2007-11-26 14:35) [2]Вот такой вот целиком кусочек кода (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;
← →
Virgo_Style © (2007-11-26 14:40) [3]1. AssignFile-CloseFile, мягко говоря, не нужны.
2. Два CopyFile с одинаковыми параметрами, кроме крайнего - на зачем??
3. CopyFile - это функция.
4. Цикл repeat подойдет.
← →
aik (2007-11-26 14:43) [4]
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:57) [5]Чем, кстати, MoveFile не подошло?
← →
новый новичок (2007-11-26 18:37) [6]-((((((((((( Парни, ничего у меня не получается -(((((((
Virgo_Style - спасибо MoveFile - гораздо удобнее. Я чё то даже как то не знал про него.
Может есть идеи или соображения?
← →
Virgo_Style © (2007-11-26 19:22) [7]> новый новичок (26.11.07 18:37) [6]
> Может есть идеи или соображения?
На предмет чего?
← →
новый новичок (2007-11-26 19:40) [8]На предмет как обойти ошибку совместного доступа к файлу.
← →
Virgo_Style © (2007-11-26 20:02) [9]Как теперь выглядит код?
← →
Gydvin © (2007-11-26 20:34) [10]Чесно говоря код не смотрел, ибо лень.
Но как вариант. Можно блок записи чтения вынести в отдельные функции, которые бы вслучае удачи или не удачи возвращали информацию об этом.
Сам блок фнутри функции заключить в try..except c досрочным фыходом. А к самой функции обращаться циклично.
Чет типа так.Function SaveFile ():boolean;
begin
result:=true;
try
// код записи
except
// в случае исключения өыход
end;
result:=false;
end;
....
while SaveFile() do sleep ();
...
← →
новый новичок (2007-11-27 07:08) [11]Пасибо парни.... выкрутился......вот что у меня получилось...
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;
Можно закрывать обсуждение и сохранять в базе... на будущее потомкам -)))
← →
Leonid Troyanovsky © (2007-11-27 10:52) [12]
> новый новичок (27.11.07 07:08) [11]
> Пасибо парни.... выкрутился......вот что у меня получилось.
Оч. плохо.
Для возбуждения исключений в MoveFile нужно еще постараться.
И, чего это за обработка - exit.
--
Regards, LVT.
← →
Virgo_Style © (2007-11-27 15:21) [13]> новый новичок (27.11.07 07:08) [11]
...и MoveFile - тоже функция.
← →
Gydvin © (2007-11-27 15:34) [14]
> ...и MoveFile - тоже функция.
Именно и она сама по себе возвращает результат выполнения
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c