Prüfen, ob eine Datei geöffnet ist

  • Hallo zusammen,

    wie das Thema schon zeigt, möchte ich gern wissen, ob und wie es möglich ist, zu prüfen, ob eine Datei geöffnet ist.

    Könnt Ihr mir da ein Beispiel zeigen, wie das funktioniert?:)

    MfG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo,

    es geht um ein FileMove. Ich möchte vorher wissen ob die Datei geöffnet ist, um hinterher nicht festzustellen, dass es nicht funktioniert hat.

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallooo,

    oh doch so einfach? ^^

    Ich probier´s nach Feierabend aus und gebe Bescheid.

    Danke schon mal für die Antworten.

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo Mikki

    Reicht nicht _WinAPI_FileInUse?

    Nur zur Sicherheit, um mögliche Missverständnisse zu vermeiden :

    _WinAPI_FileInUse() dient laut Hilfe zur Prüfung, ob eine Datei z.Zt. durch eine andere Anwendung geöffnet ist (also .txt, .pdf, .jpg usw.).

    Um zu prüfen, ob eine ausführbare Datei (also ein Programm) z.Zt. läuft, ist diese Funktion nicht geeignet (und auch nicht gedacht) !

    Hier muss z.B. ProcessExists() verwendet werden !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Mikki !

    Kurzer Nachtrag :

    Wie bereits beschrieben, ermittelt _WinAPI_FileInUse ob eine Datei gerade von einem anderen Programm geöffnet ist (siehe oben).

    Es ist dabei aber nicht entscheidend, dass sie geöffnet ist, sondern ob das aufrufende Programm ein FILELOCK auf die Datei gesetzt hat ! (einige Programme machen das, andere nicht)

    Ist eine .txt-Datei z.B. mit Notepad++ geöffnet, dann gibt _WinAPI_FileInUse eine 0 zurück, d.h. die Datei ist nicht 'InUse'

    ==> ein FileMove würde funktionieren

    Grund : Notepad++ hält eine 'Kopie' der Datei im Speicher, setzt aber keine Dateisperre (FILELOCK).

    Ist die .txt-Datei aber z.B. mit OpenOffice geöffnet, dann gibt _WinAPI_FileInUse eine 1 zurück, d.h. die Datei ist 'InUse'

    ==> ein FileMove würde nicht funktionieren !

    Grund : OpenOffice setzt eine Dateisperre (FILELOCK).

    Meine Anmerkung, dass _WinAPI_FileInUse keine gestarteten .exe-Dateien berücksichtigt, diente nur der Vollständigkeit. Man könnte es ggf. ja so fehlinterpretieren, dass die .exe-Datei doch auch im Gebrauch (InUse) sei. Dem ist aber nicht so ! Eine gestartete .exe-Datei steht zwar in der Prozessliste, kann aber i.d.R. mit FileMove verschoben werden.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo zusammen,

    so jetzt habe ich mal wieder Zeit gefunden hier zu antworten und die Vorschläge mal auszuprobieren.

    Mit _WinAPI_FileInUse hat es funktioniet. Es geht hier um .xlsx Dateien. Also Excel scheint ein FileLock zu setzen. Danke Oscar :)

    Musashi : Vielen Dank für den Tipp/Nachtrag. Das wusste ich nämlich nicht, dass viele Programme einen Filelock setzten, damit sie nicht verschoben werden können. Wieder was dazugelernt;):).

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo nochmal ^^,

    eine Frage bleibt dennoch. Wie bekomme ich denn nun raus, welche Datei geöffnet ist?

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo Oscar,

    habe mich falsch ausgedrückt. Ich meine, wenn ich als Beispiel 10 Dateien habe. Im FileMove ist ein Filter gesetzt, der z.B. die 10 .xlsx-Dateien verschieben soll.

    Beispiel für den Filter: FileMove($INI_READ_Section_1 & "\*.xlsx", $INI_READ_Section_2)

    Wie bekomme ich nun raus, welche von den 10 .xlsx-Dateien geöffnet ist?

    Wenn ich die Prüfung: Local $Check = _WinAPI_FileInUse($INI_READ_Section_1 & "\*.xlsx") ausführe dann bekomme ich in der MsgBox nur den Wert 0 zurück. Aber nicht, welche Datei geöffnet ist.

    Das sollte wie bei dem Vorgang sein, wenn ich Dateien in Windows verschiebe. Da sagt er mir ja auch, welche geöffnet ist, und ob ich den Vorgang für den Rest dennoch fortsetzen soll.

    Hoffe du verstehst was ich meine?:)^^

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Okay die Vorgehensweise habe ich verstanden. Danke

    Ich versuch´ mich mal dran.

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

    • Offizieller Beitrag

    FileMove($INI_READ_Section_1 & "\*.xlsx", $INI_READ_Section_2)

    Ich sehe gerade $INI_READ_SECTION_1 und [..]_2.

    IniReadSection liefert eigentlich ein 2D-Array zurück. Dann wäre Dein Script-Auszug falsch!

    Aber abgesehen davon, wenn Du die Pfade aus einer Inidatei liest, dann brauchst Du ja gar kein _FileListToArray.

    Die Dateinamen und Zielverzeichnisse liegen ja dann bereits vor.

    Also einfach nur die Dateinamen aus der Inidatei einzeln (in der oben angesprochenen Schleife) durchgehen.

  • Hallo Oscar !

    Ich sehe gerade $INI_READ_SECTION_1 und [..]_2.

    IniReadSection liefert eigentlich ein 2D-Array zurück. Dann wäre Dein Script-Auszug falsch!

    Ich vermute, hier gibt es ein Missverständnis :

    Mikki verwendet nicht die Funktion IniReadSection() , sondern er hat seine Keys in der .ini-Datei z.B. $INI_READ_SECTION_1 genannt !

    Ist natürlich keine glückliche Nameswahl (ich wäre auch fast darauf hereingefallen) ;)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Oscar !

    Musashi: Ja, ich habe schon gesehen, dass es sich dabei um eine Variable handelt, aber ich ging davon aus, dass er sie (bei dem Namen) auch mit IniReadSection einliest.

    Aber das ist natürlich Spekulation, da er ja kein komplettes Script gepostet hat.

    Das sollte nicht blasphemisch klingen. Dass Du den Unterschied zwischen einer Funktion und einer Variablen erkennst, steht ja wohl völlig außer Frage ;).

    In seinem DirMove-Thread hat Mikki diese, etwas unglücklichen, Keynamen aber auch bereits benutzt (mit IniRead).

    Mikki : Poste bitte mal deinen aktuellen Code und die .ini-Datei. Das würde die weitere Hilfestellung doch sehr vereinfachen:P

    Oscar :

    Da ich mir die kommende Frage bereits denken kann, mache ich mal ein kleines Testprogramm fertig :

    Die .xls-Dateien des Quellordners mit _FileListToArray einlesen (Flag : $FLTA_FILES (1)=Return files only und $bReturnPath=Full path)

    Danach die einzelnen Dateien mit _WinAPI_FileInUse prüfen, und falls OK -> FileMove.

    Wäre für Mikki wohl die am einfachsten nachvollziehbare Lösung, oder ?

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Musashi Oscar : Ja $INI_READ_SECTION_1 ist eine Variable. Ich nenne die deshalb so, damit ich direkt erkenne, zu was die gehört, bzw. was die für eine Funktion hat. Ich komme damit am besten zurecht. Andere Schreibweisen bringen mich durcheinander.

    Ich habe es aber bis jetzt noch nicht geschafft.

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.