Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.23;
Скачать: CL | DM;

Вниз

Как защититься от совместного досупа к файлу в данном случае?   Найти похожие ветки 

 
новый новичок   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
2-1195897949
WebSQLNeederr
2007-11-24 12:52
2007.12.23
Использование ini для загрузки настроек програмы


15-1195712208
NX
2007-11-22 09:16
2007.12.23
выручайте! какой загрузчик у висты


3-1187260709
Tonich
2007-08-16 14:38
2007.12.23
order by


15-1196121599
Германн
2007-11-27 02:59
2007.12.23
Опять offtop, но не могу сдержаться.


15-1195574695
TwentyThird
2007-11-20 19:04
2007.12.23
Карта звездного неба в реальном времени: созвездия, планеты...