Plik używany przez inny program

0

Haj. Poszukuję eleganckiej metody, żeby stwierdzić, czy dany plik został już całkiem ściągnięty przez przeglądarkę www, czyli że będzie on miał statusu "używany przez inną aplikację". Oczywiście mógłbym robić w sposób brutalny

while not Uwolniony do
begin
try
  Uwolniony := True;
  fsPlik := TFileStream.Create(NazwaPliku, fmOpenReadWrite);
except
  Uwolniony := False
  end;
  fsPlik.Free;
end;

ale brzydota tego rozwiązania jest potworna. Czy ktoś ma pomysła na lepsze rozwiązanie?

Errata - powyższy kod nie działa, podczas próby sprawdzenia wyskakuje wyjątek, więc tym bardziej czekam na pomoc. Dziex.

0

Weź pod uwage, że plik może aktualnie nie być używany przez inny program(przeglądarke, coś do ściągania..) i nie być do końca ściągnięty - ściąganie można zatrzymać.

0

Kilka sposobów z własnego źródła

Sposób 1

function PlikUzywany(Plik: string): Boolean;
var
 hPlik: hFile;
begin
 Result := False;
 if Plik = '' then Exit;
 if not FileExists(Plik) then Exit;

 hPlik  := CreateFile(PChar(Plik),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 Result := (hPlik = INVALID_HANDLE_VALUE);
 if not Result then CloseHandle(hPlik);
end;

Sposób 2

var
 f: textfile;
begin
 {Otwórz plik}
 try
  AssignFile (f,Edit1.Text);
  {Jeśli wystąpi błąd w otworzeniu - skanuj dalej }
 except end;

 try
  {$I-} Reset (f); {$I+}
  {Jeśli wystąpi błąd w otworzeniu - skanuj dalej}
  except end;

 case IOResult of
   0 : ShowMessage('Plik nie jest używany');
  32 : ShowMessage('Plik jest używany !');
 end;

 {Zamknij plik !! (inaczej nie bedzie można go usunąć !!)  }
 try
  CloseFile(f);
  {Jeśli wystąpi błąd w zamknięciu - skanuj dalej}
 except end;
end;

Sposób 3

function PlikUzywany(Nazwa: string): boolean;
var
 Plik: file;
begin
 {$I-}
 Assign(Plik, Nazwa);
 FileMode := 0;
 Reset(Plik);
 Close(Plik);
 {$I+}
 Result := (IOResult = 0) and (Nazwa <> '');
end;
0

Można też <ort>najprostrzym </ort>sposobem np:

if not RenameFile(NazwaPliku,NazwaPliku) then  //...itd

Po prostu po uwolnieniu pliku zmieni jego nazwę na tą samą co Ci zasygnalizuje wartością funkcji "True"
Funkcja umieszczona w timerze bardzo dobrze się mi sprawdziła działając dla plików w rózny sposób używanych.

0

Dziex za pomoc, trochę za długa przerwa w programowaniu i od razu widać skutki - główka mi nie pracuje. Najbardziej eleganckie rozwiązanie zaproponował Trzy Grosze, oto obudowany kod:

while not RenameFile(FileName, FileName) do
      Sleep(500);

Co do kwestii poruszonej przez Cyriela - nieściągnięcie całości pliku - założenie jest takie, że program ma przyspieszać wyszukiwanie pożądanych linków na stronce uploadu, po czym wysłać do przeglądarki zadanie ściągnięcia pliku (zip). Jeśli ktoś nie ściągnął danego pliku (anulował/przerwał), najwyraźniej uznał, że jest on mu zbędny, może wybrać ściąganie następnego w kolejce.
Chyba, że ktoś w końcu opracował jak ściągnąć pliki z zabezpieczonego uploadu? Oczywiście URLDownloadToFile nie działa. Próbowałem komponenetów Fundamental Sockets, ale nie wiem jak to ugryźć...

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