AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

Ein Thema von Harry Stahl · begonnen am 18. Aug 2015 · letzter Beitrag vom 19. Aug 2015
Antwort Antwort
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.361 Beiträge
 
Delphi 11 Alexandria
 
#1

IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 21:04
Tja, man kann sich wohl nicht mehr unbedingt so auf altbekannte Funktionen verlassen.

Viele nutzen sicher in einer ähnlichen Variante eine Funktion "IsFileInUse", wie z.B. hier dargestellt:

http://solvedstack.com/questions/che...open-in-delphi

Gerade stelle ich fest, dass diese Funktion für alle Dateien, die im Programmverzeichnis liegen, das Ergebnis "True" (also offen, bzw. in Benutzung) zurückliefert, auch wenn die gar nicht in Benutzung sind (vermute, dass das wohl ab Windows Vista schon so ist?).

Lediglich wenn man sein Programm im Admin-Modus ausführt, wird das korrekte Ergebnis zurückgeliefert.

Für mein Dateimanager-Programm verwende ich zwar schon ein Extra-Modul mit Adminmodus für alle Aktionen, die im Programm- oder Systemverzeichnis stattfinden sollen (also kopieren, löschen, umbenennen), aber die Suchfunktion ist noch im Hauptmodul (das standardmäßig im User-Modus läuft), möchte ungern an dieser Stelle für die Suchfunktion (Suchen in Dateien) wieder alles umstricken.

Kennt jemand eine Variante, wie man das korrekte Ergebnis erhält, ohne den Admin-Modus zu verwenden?

Geändert von Harry Stahl (18. Aug 2015 um 21:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.100 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 21:30
Die Funktion hat schon immer ihre Probleme wenn sie wegen Rechtprobleme eine Datei nicht zum schreiben öffnen darf
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.961 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 21:56
Was hast du denn erwartet? Die Funktion tut nichts anderes als zu versuchen die Datei zum Schreiben zu öffnen. Dann sagt sie, ob es fehlgeschlagen ist. Ohne Administratorrechte kannst du natürlich auch keine Systemdateien verändern.

Das "in use" ist eigentlich schon irreführend. Jemand kann genauso gut in eine Datei schreiben und den Zugriff trotzdem nicht verbieten. Dann ist die Datei eigentlich "in use", wird auch aktiv verändert, und deine Funktion schlägt trotzdem nicht fehl und sagt "Nö, ist nicht in use".
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 22:45
Die Funktion sollte besser "kannIchSchreiben" heißen. InUse stimmt spätestens seit Dos 3.1 nicht mehr.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.637 Beiträge
 
Delphi 5 Professional
 
#5

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 22:54
Die Funktion sollte besser "kannIchSchreiben" heißen.
... wenn sie den invertierten Boolean-Wert zurückgibt (ohne Adminrechte gibt sie True zurück).

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.361 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 18. Aug 2015, 23:26
Was hast du denn erwartet? Die Funktion tut nichts anderes als zu versuchen die Datei zum Schreiben zu öffnen. Dann sagt sie, ob es fehlgeschlagen ist. Ohne Administratorrechte kannst du natürlich auch keine Systemdateien verändern.
Ja, das ist ein berechtigter Hinweis. Man sollte sich die verwendeten Parameter doch ein wenig genauer ansehen.

Letztlich will ich ja auch nur wissen, ob ich die Datei öffnen kann, schreiben will ich ja gar nicht, sondern nur durchsuchen.

Insofern mache ich da jetzt einfach was passendes draus (lasse also generic_write weg) und schon läuft es wie gewünscht:

Delphi-Quellcode:
function CanOpenFile(fName: string; CheckIfExist: Boolean) : boolean;
var
  HFileRes: HFILE;
begin
  Result := False;

  if (CheckIfExist=True) and (not FileExists(fName)) then begin
    Exit;
  end;

  HFileRes := CreateFile(PChar(fName)
    ,GENERIC_READ
    ,0
    ,nil
    ,OPEN_EXISTING
    ,FILE_ATTRIBUTE_NORMAL
    ,0);

  Result := (HFileRes <> INVALID_HANDLE_VALUE);

  if Result then begin
    CloseHandle(HFileRes);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 19. Aug 2015, 00:03
Nichts ist älter als der Status von eben

Eben war die datei noch zu öffnen und jetzt, wo du sie öffnen möchtest, ist die gerade gesperrt worden.

Das einfachste ist, die Datei direkt zu öffnen und auf entsprechende Fehler/Exceptions zu reagieren (z.B. x mal versuchen und dann erst mit der Exception abbrechen).

Was du jetzt machst ist die Datei zu öffnen und wieder zu schliessen um diese dann wieder zu öffnen ...

Und eine Datei, die nicht existiert, bekommst du mit den Parametern nicht geöffnet, somit ist der Parameter CheckIfExists irgendwie unnütz.

If ( CheckIfExists = true ) and ...
Warum nicht viel lesbarer if CheckIfExists and ... ?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Aug 2015 um 00:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.361 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 19. Aug 2015, 00:37
Nichts ist älter als der Status von eben

Eben war die datei noch zu öffnen und jetzt, wo du sie öffnen möchtest, ist die gerade gesperrt worden.

Das einfachste ist, die Datei direkt zu öffnen und auf entsprechende Fehler/Exceptions zu reagieren (z.B. x mal versuchen und dann erst mit der Exception abbrechen).

Was du jetzt machst ist die Datei zu öffnen und wieder zu schliessen um diese dann wieder zu öffnen ...

Und eine Datei, die nicht existiert, bekommst du mit den Parametern nicht geöffnet, somit ist der Parameter CheckIfExists irgendwie unnütz.
Dass die Datei existiert, weiß ich schon wenn ich die CanOpenFile-Funktion aufrufe, will es daher in dieser Funktion nicht noch einmal prüfen (wenn man die Funktion 100.000 mal aufruft, kann das schon zeitlich was ausmachen).

Die Prüfung (ob man die Datei öffnen kann) hatte ich wohl (ist schon ein paar Jahre her) vermutlich eingeführt, weil es anscheinend zu größeren Problemen kommen konnte, wenn man versucht eine gesperrte Datei zu öffnen / oder weil es sich dann zeitlich spürbar verschlechterte.

Grundsätzlich versuche ich es immer so zu machen, dass die Frage, ob etwas geht oder nicht, möglichst nicht mit dem Auslösen einer Exception geklärt wird.

Muss ich mir im vorliegenden Fall aber noch mal überlegen. Ist ja eher unwahrscheinlich, dass die zu durchsuchenden Dateien gesperrt sind, insofern könnte das "doppelte" öffnen tatsächlich mehr Zeit kosten, als der (evtl.)" Wurf von einigen Exceptions.

If ( CheckIfExists = true ) and ...
Warum nicht viel lesbarer if CheckIfExists and ... ?
Jupp, das war ein Rest von was anderem, ist schon weg
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.707 Beiträge
 
Delphi 2007 Professional
 
#9

AW: IsFileInUse : Ergebnis unterschiedlich im Admin-Modus

  Alt 19. Aug 2015, 09:23
FWIW: Das scheint mir so eine überflüssige Abkupferseite zu sein. Ich denke, das ist das Original: http://stackoverflow.com/questions/1...open-in-delphi
Uli Gerhardt
  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 07:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf