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
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
Anders gefragt: Wozu willst du es wissen?
Ist die Datei von dem anderen Prozess gesperrt so dass ein FileOpen darauf versagt oder möchtest du selbst gern andere Zugriffe darauf verhindern?
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.
Hallo Mikki,
da genügt doch einfach das Auswerten von FileMove, oder?
Ein Skript, dass für mich gut funktioniert findest du hier: https://www.autoitscript.com/forum/topic/12…&comment=853798
Aber riesen Vorteile sehe ich in deinem Fall eigentlich nicht.
Reicht nicht _WinAPI_FileInUse?
Danke. Die Funktion kannte ich auch nicht Oscar
Hallooo,
oh doch so einfach?
Ich probier´s nach Feierabend aus und gebe Bescheid.
Danke schon mal für die Antworten.
LG Mikki
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
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
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
Hallo nochmal ,
eine Frage bleibt dennoch. Wie bekomme ich denn nun raus, welche Datei geöffnet ist?
LG Mikki
Wie bekomme ich denn nun raus, welche Datei geöffnet ist?
Die Frage verstehe ich nicht wirklich.
Du musst _WinAPI_FileInUse mit der Datei benutzen, die mit FileMove verschoben werden soll.
Wenn TRUE, dann ist diese Datei gelockt, ansonsten nicht.
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
Im FileMove ist ein Filter gesetzt
Das würde ich nicht machen!
Lieber die Dateien einlesen (_FileListToArray) und dann in einer Schleife durchgehen und vor jedem FileMove dann _WinAPI_FileInUse einsetzen.
Okay die Vorgehensweise habe ich verstanden. Danke
Ich versuch´ mich mal dran.
LG Mikki
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
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.
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
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
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