Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1195794262
Бакук
2007-11-23 08:04
2007.12.23
IIS 6.0 для XP


2-1196171705
Anti Gopn!k
2007-11-27 16:55
2007.12.23
Сделать недоступным


2-1195710167
Costy
2007-11-22 08:42
2007.12.23
Ускорения tClientSocket (tserverSocket)


2-1195824372
Student00
2007-11-23 16:26
2007.12.23
вызов процедур из модуля, delphi


2-1196481525
San1712
2007-12-01 06:58
2007.12.23
Возникает сообщение об ошибке как его обработать ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский