Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как защититься от совместного досупа к файлу в данном случае? [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]

Т.е. как бы этот блок снова выполнить что ли.... Иначе у меня объект дальше в программе не создасться.


Наверх

Титульная страница Поиск, карта сайта Написать письмо