Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Geöffnete bzw. gesperrte Datei kopieren (https://www.delphipraxis.net/56343-geoeffnete-bzw-gesperrte-datei-kopieren.html)

Baeuerle 4. Nov 2005 10:29


Geöffnete bzw. gesperrte Datei kopieren
 
Hallo,

so jetzt wird es mal richtig schwierig :)
Wie kann ich geöffnete bzw. vom System gesperrte Dateien kopieren ???

Bsp: Eine Anwendung öffnet eine Datei im Modus fmShareExclusive eine zweite Anwendung soll diese geöffnete Datei aber kopieren!

Im vorraus schon mal danke

Bauerle

ichbins 4. Nov 2005 10:44

Re: Geöffnete bzw. gesperrte Datei kopieren
 
erstmal: garnicht. du könntest irgendwie ermitteln, welches Programm die Datei verwendet, das abwürgen und es dann nochmal versuchen... nicht besonders elegant. Dann kannst du die Datei beim nächsten Hochfahren (reboot) von Windows kopieren. Es kann allerdings auch sein dass die Datei nur für den Schreibzugriff gesperrt ist (wie z.B. EXE-Datei). Dann machst du das so:
Delphi-Quellcode:
var
  f,t:file of byte;
  buf:array[1..4096] of byte;
  copied:integer;
begin
  assignfile(f,fromfilename);
  filemode:=0;              //nur für readaccess öffnen
  reset(f);
  filemode:=1;
  assignfile(g,tofilename);
  rewrite(g);
  while copied>0 do begin
    blockread(f,buf,4096,copied);
    blockwrite(g,buf,copied);
  end;
  closefile(g);
  closefile(f);
  filemode:=2;
end;

runger 4. Nov 2005 10:56

Re: Geöffnete bzw. gesperrte Datei kopieren
 
Hallo,

wenn du schon solche Bastellösungen vorschlägst, dann nimm bitte für Filemode die vordefinierten Konstanten.

Delphi-Quellcode:
Konstante   Definition

fmCreate   Wenn die Datei bereits vorhanden ist, wird sie für den Schreibzugriff geöffnet, ansonsten wird eine neue Datei angelegt. Im Gegensatz zu den anderen Konstanten, die in der Unit SysUtils deklariert sind, ist diese Konstante in der Unit tge classes deklariert.

fmOpenRead   Nur Lesezugriff.

fmOpenWrite   Nur Schreibzugriff.

fmOpenReadWrite   Lese- und Schreibzugriff.

fmShareCompat   Kompatibel zu dem Verfahren, mit dem FCBs geöffnet werden. Verwenden Sie diesen Modus nicht in plattformübergreifenden Anwendungen.

fmShareExclusive   Kein Lese- und Schreibzugriff.

fmShareDenyWrite   Kein Schreibzugriff.

fmShareDenyRead   Kein Lesezugriff. Verwenden Sie diesen Modus nicht in plattformübergreifenden Anwendungen.

fmShareDenyNone   Andere haben uneingeschränkten Zugriff.
Rainer

Baeuerle 4. Nov 2005 10:58

Re: Geöffnete bzw. gesperrte Datei kopieren
 
Hmm, ist nich gerade befriedigend !!!
Zitat:

Erstmal garnicht
kann ich so leider nicht stehen lassen! Es muss Lösungen geben siehe Image-Software; Desaster Recovery ....

Vielleicht ein Hardcopy direkt auf ner HDD ???

Ich bitte um weitere Vorschläge

NicoDE 4. Nov 2005 10:58

Re: Geöffnete bzw. gesperrte Datei kopieren
 
Zitat:

Zitat von Baeuerle
so jetzt wird es mal richtig schwierig :)

Schwierig ist relativ, ich würde eher sagen 'aufwändig' :)

Zitat:

Zitat von Baeuerle
Wie kann ich geöffnete bzw. vom System gesperrte Dateien kopieren ?

Definiere "vom System gesperrt"...

Ein möglicher Ansatz könnte bei MSDN-Library durchsuchenDuplicateHandle beginnen. Allerdings besteht das 'aufwändige' Problem darin, an die notwendigen Parameter zu gelangen (z.B.: welches Handle gehört zum gesuchten Dateiobjekt? - eine dokumentierte Antwort auf die Frage in Form einer Win32-API gibt's nicht).

Zitat:

Zitat von Baeuerle
Eine Anwendung öffnet eine Datei im Modus fmShareExclusive eine zweite Anwendung soll diese geöffnete Datei aber kopieren!

Das Kopieren wird zu Problemen führen. Beispiel: die Anwendung mit exklusivem Zugriff geht davon aus, dass sich der Dateizeiger des Objekts nicht ändert - beim Kopieren durch die zweite Anwendung wäre es unvermeidlich diesen zu ändern. Über die dokumentierten Win32-APIs gibt es keinen Weg um dieses Problem sauber zu lösen (man müsste alle Zugriffe auf das Dateiobjekt durch 'andere' unterbinden - nur wie?, das ist die Frage...).

Baeuerle 4. Nov 2005 11:10

Re: Geöffnete bzw. gesperrte Datei kopieren
 
@NicoDE

Aufwendig spielt keine Rolle Hauptsache es geht!

Zitat:

vom System gesperrt
z.B. c:\Pagefile.sys

ok, dein Ansatz ist nicht schlecht, reicht aber leider nicht aus um das Problem komplett zu lösen!

Ist es nicht möglich eine genau kopie des Files in den Speicher zu laden und dieses dann zu schreiben???
(Versteht das jemand)

Baeuerle 4. Nov 2005 11:14

Re: Geöffnete bzw. gesperrte Datei kopieren
 
Klick:
Delphi-Quellcode:
Findfirst('c:\pagefile.sys',faAnyFile,rec);

rec.win32.findhandle
so hätte ich doch schonmal das entsprechende Handle oder ??

NicoDE 4. Nov 2005 11:21

Re: Geöffnete bzw. gesperrte Datei kopieren
 
Zitat:

Zitat von Baeuerle
Ist es nicht möglich eine genau kopie des Files in den Speicher zu laden und dieses dann zu schreiben?

Genaue Kopie von welchem Moment... das ist die Frage!
Stellt Dir vor, dass du gerade die Daten aus der 'Mitte' liest und sich während dessen der Inhalt am Anfang wieder ändert...

Lies dir bitte mal den Abschnitt Volume Shadow Copy Service im Artikel Windows XP: Kernel Improvements Create a More Robust, Powerful, and Scalable OS durch.

Der wichtigste Teil:
Zitat:

The entire shadow copy API is currently only available to ISVs under NDA; however, file system drivers must properly handle two documented shadow copy-related I/O control requests (IOCTL): IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES and IOCTL_VOLSNAP_RELEASE_WRITES. Their names are self-explanatory. The shadow copy API sends the IOCTLs to the logical drives for which snapshots are being taken so that all modifications initiated before the snapshot have completed when the shadow copy is taken, making the file data recorded from a shadow copy consistent in time.
edit:
Zitat:

Zitat von Baeuerle
so hätte ich doch schonmal das entsprechende Handle oder ??

Nein, das ist ein Handle zu einer Liste von Dateiinformationen die durch eine Suche entstand...


Gruß Nico

edit2: How Volume Shadow Copy Service Works

mumu 4. Nov 2005 12:25

Re: Geöffnete bzw. gesperrte Datei kopieren
 
um den zugriff auf die datei freizugeben, musst du einen treiber programmieren.

siehe
Dateisperre freigeben


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz