AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Datei bereits verwendet?

Ein Thema von user0 · begonnen am 5. Dez 2006 · letzter Beitrag vom 9. Dez 2006
Antwort Antwort
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#1

Datei bereits verwendet?

  Alt 5. Dez 2006, 16:02
Hallo Delphi-programmierer,

wie kann ich herrausfinden, ob eine Datei bereits von einem anderen Programm bzw. Prozess
geöffnet wurde? Z.B. Wenn ich eine xls-Datei lesen will, die bereits mit Excel geöffnet wurde.
In diesem Fall soll das Programm eine Kopie der Datei erstellen.

Danke schonmal für eure Hilfe,

user0
  Mit Zitat antworten Zitat
ichbins

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

Re: Datei bereits verwendet?

  Alt 5. Dez 2006, 16:16
Wie wärs einfach mit probieren-geht-über-studieren?

Delphi-Quellcode:
assignfile(f,filename);
filemode:=2; //Modus für Lesen und Schreiben, Standard
try
  reset(f)
except
  closefile(f);
  filemode:=0; //Read-Only-Modus (geht auch, wenn die Datei geöffnet ist)
  reset(f);
  dateikopieren;

  filemode:=2; //filemode auf Standard zurücksetzen
end;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Datei bereits verwendet?

  Alt 5. Dez 2006, 16:18
Und was ist, wenn die Datei nicht exklusiv geöffnet wurde?

Das geht wohl nur über eine Liste mit Programmen, die ein Handle auf die datei geöffnet haben. Siehe dazu FileMon von Sysinternals. Und das wiederum geht wahrscheinlich nur mit einem Dateisystem-Filter-Treiber.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Datei bereits verwendet?

  Alt 5. Dez 2006, 16:25
Zitat von Luckie:
Und was ist, wenn die Datei nicht exklusiv geöffnet wurde?

....
Versuch doch, sie selbst exklusiv zu öffnen. Wenn das geht, hat sie sonst niemand offen.

Gruss Reinhard
  Mit Zitat antworten Zitat
ichbins

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

Re: Datei bereits verwendet?

  Alt 5. Dez 2006, 17:50
Denk ich auch.

Bevor du dir alle Handles per Treiber (den du schlimmstenfalls noch installieren musst und für den du Admin-Rechte benötigst und etc.) zusammenkratzt und überprüfst, versuch einfach die Datei über try...except selbst zu öffnen und das Problem hat sich.

Das ist (abgesehen vom Programmieraufwand) wohl auch weit weniger CPU- und RAM-Intensiver und meiner Meinung auch nicht "unsauber".
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.918 Beiträge
 
Delphi 12 Athens
 
#6

Re: Datei bereits verwendet?

  Alt 8. Dez 2006, 17:31
Zitat von Reinhard Kern:
Versuch doch, sie selbst exklusiv zu öffnen. Wenn das geht, hat sie sonst niemand offen.
Ich will ja nichts sagen, da es im meistens stimmt...



aber ...


Na ja, im Anhang sind 3 Programme:

Project3 erstellt 'ne Datei und hällt sie geöffnet - der Inhalt wird ausgelesen und angezeigt.

Project4 öffnet diese Datei mit exclusiven Rechten und schreibt was rein.
(könnt euch ja im QuellCode vergewissern)

Project5 öffnet die Datei mit Sharingrechten, ließt/schreibt den Inhalt und zeigt ihn an.


Das, was Project4 und Project5 machen, nochma im Kurzen...
Delphi-Quellcode:
// Project4
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE,
  0 {kein FILE_SHARE_READ und FILE_SHARE_WRITE}, nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE Then Raise Exception.Create('Can''t open the file.');

While ... do Begin
  i := Random(MaxInt);
  SetFilePointer(FH, 0, nil, FILE_BEGIN);
  WriteFile(FH, i, 4, W, nil);
  Edit1.Text := IntToStr(i);
End;

CloseHandle(FH);
Wie man sieht ... keine SharingRecht.
Delphi-Quellcode:
// Project5
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ und FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE Then Raise Exception.Create('Can''t open the file.');

While ... do Begin
  SetFilePointer(FH, 0, nil, FILE_BEGIN);
  ReadFile(FH, i, 4, W, nil);
  Edit1.Text := IntToStr(i);
End;

CloseHandle(FH);


Aber nun mal zum Grund:
[quote="MSDN - CreateFile"]dwShareMode
[in] Sharing mode of the object (reading, writing, both, or neither).
You cannot request a sharing mode that conflicts with the access mode specified in a previous open request whose handle is still open.
Dieses gilt also nur für "offene" FileHandles ... Project3 jedoch öffnet/erstellt die Datei zwar per
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0); aber schließt daß FileHandle danach wieder.

Demnach würde "... alle Handles per Treiber zusammenkratzt und überprüfst..." leider auch nicht funktionieren. :tonque:
Selbst über FileMon und den ProcessExplorer bekommen man nichts von einem FileHandle in Project3 mit. (OK, es gibt ja Keines mehr)



Also, für'n "Normalfall" sollte das Öffnen mit exclusiven Rechten vollkommend ausreichend sein
und der winzige Rest wird wohl ein bissl zu aufwendig werden. :engel:
Ich kenn jedenfalls noch keine andere wirkungsvolle Methode dieses "schnell/einfach" zu prüfen.


  • Project3 und danach Project4 starten = Datei läßt sich exclusiv öffnen
  • Project5 und danach Project4 starten = Datei läßt sich nicht exclusiv öffnen
  • Project4 und danach Project5 starten = Datei läßt sich nicht öffen, da bereits exclusiv geöffnen
  • Project5 mehrmals starten = Datei läßt sich öffnen
    Sollte ja auch Aufgrund der SharingRechte so sein.
  • Project5 und Project3 können natürlich beliebig oft gestartet werden.
    Kein Wunder, denn der Aufruf von CreateFile ist ganz genau gleich und mit SharingRechten
Angehängte Dateien
Dateityp: zip datei_bereits_verwendet_209.zip (566,2 KB, 38x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Datei bereits verwendet?

  Alt 8. Dez 2006, 21:58
Moin Himitsu,

Dein "aber" zu Reinhards Aussage kann ich jetzt nicht nachvollziehen.

Ausgangspunkt war es doch festzustellen, ob die Datei im Zugriff ist.
Kann man sie nicht exklusiv öffnen, ist dass nicht der Fall.

Zitat von himitsu:
Project3 erstellt 'ne Datei und hällt sie geöffnet - der Inhalt wird ausgelesen und angezeigt.
Zitat von himitsu:
Dieses gilt also nur für "offene" FileHandles ... Project3 jedoch öffnet/erstellt die Datei zwar per

FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0); aber schließt daß FileHandle danach wieder.
Was denn nun?
Hält Projekt3 die Datei nun geöffnet, oder wird das Handle wieder geschlossen?

Im ersten schlägt der Versuch die Datei exklusiv zu öffnen fehl, im zweiten nicht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.918 Beiträge
 
Delphi 12 Athens
 
#8

Re: Datei bereits verwendet?

  Alt 9. Dez 2006, 09:59
Also, die Datei bleibt im Zugriff (in Project3 zwar nur lesend, aber schreibend wäre och leicht möglich)
und das obwohl das FileHandle wieder freigegeben wurde.

Also es ist möglich sich einen Schreib-/Lesezugriff zu besorgen und das ohne ein FileHandle wärenddessen zu benötigen.

CreateFile prüft aber nur die SharingRechte in vorhandenen FileHandles zur betreffenden Datei.



Project3 öffnet sich die Datei per CreateFile, leitet den Zugriff etwas um und schließt dann sofort das FileHandle wieder, da für diesen Schreib-/Lesezugriff kein FileHandle nötig ist. ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Datei bereits verwendet?

  Alt 9. Dez 2006, 12:11
Moin Himitsu,

dann sei doch mal so gut, und stell auch den Source von Projekt3 hier rein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:21 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