AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Geöffnete bzw. gesperrte Datei kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Geöffnete bzw. gesperrte Datei kopieren

Ein Thema von Baeuerle · begonnen am 4. Nov 2005 · letzter Beitrag vom 4. Nov 2005
Antwort Antwort
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#1

Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 10:29
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
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 10:44
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;
Michael Enßlin
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#3

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 10:56
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
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 10:58
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 10:58
Zitat von Baeuerle:
so jetzt wird es mal richtig schwierig
Schwierig ist relativ, ich würde eher sagen 'aufwändig'

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 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...).
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 11:10
@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)
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 11:14
Klick:
Delphi-Quellcode:
Findfirst('c:\pagefile.sys',faAnyFile,rec);

rec.win32.findhandle
so hätte ich doch schonmal das entsprechende Handle oder ??
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 11:21
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 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
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#9

Re: Geöffnete bzw. gesperrte Datei kopieren

  Alt 4. Nov 2005, 12:25
um den zugriff auf die datei freizugeben, musst du einen treiber programmieren.

siehe
Dateisperre freigeben
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 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