[Delphi] Blokowanie dostępu do pliku

0

Jak zablokowac dostep do aktualnie przetwarzanego pliku? cos na styl komendy flock z PHP.

Mam taki fragment kodu:

AssignFile(f, 'd:\po.dat');
FileMode := fmOpenWrite;
Reset(f);

I robie taki manewr, dalej nastepuje specialnie spowolniona procedura zapisu (1000 po 4 bajty). Odpalam 2x program i w trakcie gdy jeden zapisuje robie to samo drugim i co ciekawe nie ma zadnego bledu ani nic.

Dla analogicznej sytuacji w PHP ten drugi czekal by tak dlugo az pierwszy nie zamknie pliku, jak tutaj osiagnac taki cel? tzn. jak sprawdzic czy plik nie jest otwarty przez inna aplikacje? (pozniej majac taka informacje to juz dany watek moze czekac na dostep odpowiedni czas). Ew. co robie nie tak ustawianiu FileMode? gdyz przy takiej wrtosci jaka podalem powinienem osiagnac to co chcialem jednak tak nie jest.

Co jeszcze ciekawe, po akonczeniu dzialania obu instancji programu plik wynikowy wyglada tak jakby tylko jeden program dzialal.

0

Znajomość WinAPI się kłania i funkcja CreateFile. Zajrzyj do dokumentacji tam wszystko jest dokładnie opisane.

0

TFileStream i tryb otwarcia:

fmShareCompat     Sharing is compatible with the way FCBs are opened.
fmShareExclusive  Other applications can not open the file for any reason.
fmShareDenyWrite  Other applications can open the file for reading but not for writing.
fmShareDenyRead   Other applications can open the file for writing but not for reading.
fmShareDenyNone   No attempt is made to prevent other applications from reading from or writing to the file.
0

Dobra Panowie, znalazlem rozwiazanie posrednie ;)

AssignFile(f, 'd:\po.txt');
FileMode := fmOpenReadWrite or fmShareExclusive;

{$I-}
try
Reset(f);
except
end;
{$I+}

if IOResult <> 0 then
  begin
  Caption := 'Brak dostepu do pliku';
  Exit;
  end;
0

a po co to try..except? lub też po co to {$I} - tego się używało w tp i dosie. W systemach Win uzywa się wyjątków

0

Bez try.. except wyskoczy okienko z delphi ze blad. A bez derektywy IOResult nic nie zwroci.

0

A czy to dobre rozwiązanie skoro podczas sprawdzania sam otwierasz plik ?.
Więc pokazuje non stop plik w uzyciu :P

Czy nie najprostrze użyć funkcji do zmiany nazwy pliku (na tą samą oczywiście)
i wynik funkcji Ci pokaże czy plik używany lub nie

 if not RenameFile('c:\aa.mp3','c:\aa.mp3') then Caption:= 'uzywany'
    else Caption:= 'wolny';

Sprawdz to załacząjąc mp3 winampem i działa :D
Moze to nieelegancke ale <ort>najprostrze </ort>z możliwych rozwiązań :P

0

A czy to dobre rozwiązanie skoro podczas sprawdzania sam otwierasz plik ?.

Nie otwieram pliku. Dopiero reset to robi ktory w przypadku juz innego otwarcie zwroci odpowiedni IOResult. Sprawdzalem to i dziala tak jak nalezy, innaczej bym tego nie napisal nawet tutaj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1