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/)
-   -   Prüfen, ob Datei gesperrt ist (https://www.delphipraxis.net/163025-pruefen-ob-datei-gesperrt-ist.html)

amigage 13. Sep 2011 12:21

Prüfen, ob Datei gesperrt ist
 
Hallo,

ich weiß, dass dieses Thema bereits im Forum besprochen wurde, aber die Funktion
Delphi-Quellcode:
IsFileInUse()
unter http://www.delphipraxis.net/67631-ue...zt-werden.html funktioniert bei mir nicht.

Ich habe ein Testprogramm, dass bei mir die Datei test.txt exklusiv öffnet.

Code:
  try
    fs := TFileStream.Create('C:\test.txt', fmShareExclusive);
  except
    fs := nil; //damit fs.Free keine Exception wirft
    exit;
  end;
Versuche ich die Datei im Texteditor zu öffnen, bekomme ich die Meldung, dass sie nicht geöffnet werden kann.
Soweit so gut.

Mein zweites Programm soll das überprüfen:

Code:
if IsFileInUse('C:\test.txt') = false then
  Showmessage('Alles ok.')
else
  Showmessage('Die Datei ist gesperrt.');
Leider gibt das Programm immer Alles OK. aus.

Kann mir einer auf die Sprünge helfen, woran das liegen könnte?
Danke.

Bernhard Geyer 13. Sep 2011 12:34

AW: Prüfen, ob Datei gesperrt ist
 
Glaskugel auspack: Du hast Win7/Vista mit aktivem UAC und deine Anwendung hat kein passendes Manifest um die Virtualisierung des Dateisystems abzuschalten.

arnold mueller 13. Sep 2011 12:36

AW: Prüfen, ob Datei gesperrt ist
 
Mal ins Blaue geschossen: Windows 7 und UAC??

amigage 13. Sep 2011 13:08

AW: Prüfen, ob Datei gesperrt ist
 
Ja, ich habe Win7 mit UAC.
Zitat:

hat kein passendes Manifest um die Virtualisierung des Dateisystems abzuschalten.
Möglich, ich nutze die in Delphi 2009 integrierte Funktion "Laufzeit-Theme aktivieren".
Was muss ich tun, um die Virtualisierung zu umgehen?

sott1981 13. Sep 2011 13:16

AW: Prüfen, ob Datei gesperrt ist
 
Bin keine Profi warte aber auch grade auf ne Antwort.

Vielleicht passt das : Vista's User Account Control Handling



Musst ein bischen scrollen. Hoffe englsich passt...

Delphi-Laie 13. Sep 2011 13:44

AW: Prüfen, ob Datei gesperrt ist
 
Hallo Ihr!

Vor einem ähnlichen Problem stehe, eher stand ich auch, und zwar ist es einer gehookten DLL unter Windows 7 64 Bit i.d.R. unmöglich, auf eine Datei lesend zuzugreifen, außer, wenn das Programm, das den Hook installiert hat (Hostprogramm?), diesen Hook auslöst.

Deshalb waren die Hinweise hier nützlich, doch Änderungen an der UAC brachten auch nach Neustart bei mir keinen Erfolg. Datei kann nicht zum Lesen geöffnet werden, der Fehlercode von IOResult=5 ("Kein Dateizugriff möglich", das kam mir auch vorher schon so vor).

Insofern werde ich es wohl mit sog. "Memory Mapped Files" probieren, vielleicht funktioniert es ja damit.

amigage 13. Sep 2011 13:47

AW: Prüfen, ob Datei gesperrt ist
 
Also, ich dachte ich muss wegen der Virtualisierung noch etwas ins Manifest hinzufügen.
Aber ich nutze ja derzeit das folgende Manifest als eigebundene Ressource.

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    name="Mein Programm"
    processorArchitecture="x86"
    version="1.0.0.0"
    type="win32"/>
<description>Programmbeschreibung</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
      <requestedPrivileges>
         <requestedExecutionLevel
            level   = "asInvoker"
            uiAccess = "false" />
      </requestedPrivileges>
   </security>
</trustInfo>
</assembly>
@Delphi-Laie: Ich habe nicht das Problem, dass ich nicht zugreifen kann. Ganz im Gegenteil, es wird zurückgegeben, dass man auf die Datei zugreifen kann, obwohl sie gesperrt ist.

Bernhard Geyer 13. Sep 2011 14:03

AW: Prüfen, ob Datei gesperrt ist
 
Was sagt der Taskmanager zu deinem Prozess (Spalte "UAC-Virtualisierung") und was sagt der Taskmanager zu dem anderen Prozess der sperren soll?

amigage 13. Sep 2011 14:16

AW: Prüfen, ob Datei gesperrt ist
 
Bei beiden Programmen ist die UAC-Virtualisierung deaktiviert.

Delphi-Laie 13. Sep 2011 14:22

AW: Prüfen, ob Datei gesperrt ist
 
Zitat:

Zitat von amigage (Beitrag 1123990)
@Delphi-Laie: Ich habe nicht das Problem, dass ich nicht zugreifen kann. Ganz im Gegenteil, es wird zurückgegeben, dass man auf die Datei zugreifen kann, obwohl sie gesperrt ist.

Dann war ich etwas flüchtig beim Lesen - also stehe ich nicht vor einem ähnlichen, sondern vor dem inversen Problem, möchte das hier aber nicht weiter detaillieren, es ist ja schließlich nicht meine Diskussion.

p80286 13. Sep 2011 15:21

AW: Prüfen, ob Datei gesperrt ist
 
@Delphi-Laie
Das liest sich als würdest Du noch die "alten" Dateifunktionen nutzen. Ggf. hilft die Filemode:=0 weiter.

Gruß
K-H

Delphi-Laie 13. Sep 2011 15:45

AW: Prüfen, ob Datei gesperrt ist
 
Zitat:

Zitat von p80286 (Beitrag 1124051)
@Delphi-Laie
Das liest sich als würdest Du noch die "alten" Dateifunktionen nutzen. Ggf. hilft die Filemode:=0 weiter.

Danke! Das war eine gute Idee, von der ich natürlich bis vorhin nichts wußte und die sich sehr plausibel las. Doch leider ändert es nichts am unerwünschten Verhalten. Mit MMP bin ich mittlerweile nun soweit vorangeschritten, daß es grundsätzlich funktioniert.

amigage 14. Sep 2011 13:07

AW: Prüfen, ob Datei gesperrt ist
 
So, jetzt wird es kurios :o

Ich habe soeben die Funktion in meinem Programm unter XP und Vista ausprobiert und dabei versucht, auf geöffnete Excel-Dateien zuzugreifen. Und ja, die Funktion hat richtig zurückgegeben, wenn diese in Benutzung waren.

Also habe ich noch einmal unter meinem Windows 7 probiert. Nichts, das Programm hat immer zurückgegeben, dass die Dateien nicht gesperrt wären. Ich war schon am Verzweifeln und habe die exe-Datei auf dem Desktop abgelegt. Wenn ich diese von dort starte, funktioniert es wie gewünscht. Das Programm mit der Funktion IsFileInUse() funktioniert.

Aber kann mir einmal einer erklären, warum es abhängig davon ist, wo meine ausführbare Datei liegt? Das macht doch keinen Sinn.

Danke.

Union 14. Sep 2011 15:23

AW: Prüfen, ob Datei gesperrt ist
 
Hast Du es mal mit LockFile versucht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.

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