Wie feststellen ob Datei in Benutzung ist?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lordnaikon
User
Beiträge: 58
Registriert: Dienstag 9. Februar 2010, 13:41

schönen guten tag, die forensuche hat mich leider nicht sehr weit gebracht, weil ich auch nicht so genau weiß, wonach ich suchen muss/soll.

ich arbeite gerade an einem programm, man höre und staune, welches dateien verarbeiten soll. das programm soll auf einem (windows)server laufen auf dem dateien hochgeladen werden. mit einem python script will ich diese weiterverarbeiten.

momentan ist der plan alle 10 sek oder so zu pollen, also einfach nachzugucken ob sich ne datei in nen bestimmten pfad befindet.

dummerweise hab ich dann halt das problem, dass ich nicht weiß, ob die datei schon fertig geuppt wurde. ich lade sie zwar erst in ein temp ordner und kopiere sie nach vollständigem upload in den "quellordner", aber das kopieren dauert ja auch nen paar sekündchen und wenn das pollen zu nem dummen zeitpunkt feuert hab ich ein problem?!

wie stell ich "sicher" fest, das die datei "frei" zum weiterverarbeiten ist. ich dachte ein einfaches öffnen mit schreibrechten führt zu einer exception, dem ist aber leider nicht so :(

das einzige was mir jetzt einfallen würde ist, die datei zu öffnen, größe merken und wieder schließen; ne sekunde warten und dann größe vergleichen.

ich hoffe es kann mir einer von euch helfen, ne gescheite lösung zu finden

mfg LordNaikon :)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Unter Linux würde man sowas mit ''lsof'' machen. Also habe ich einfach mal nach ''lsof windows'' gesucht und bin unter anderem auf dieses Tool gestoßen: http://technet.microsoft.com/en-us/sysi ... 96655.aspx

Ich konnte es jetzt nicht testen, aber vielleicht hilft es dir ja. Ansonsten dürfte dir der genannte Suchbegriff vll. auch schon weiterhelfen. Falls Windows (was ich glaube) kein ls-Äquivalent von Haus aus hat, wird Python es sehr wahrscheinlich auch nicht kennen und du musst externe Programme benutzen.

Schönen Gruß,

brb
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich denke, am besten wäre es, wmi zu benutzen, um nachzuschauen, ob auf dem Share die Datei noch im Schreibzugriff ist.
EDIT: URL eingefügt. Es gibt Beispiele in VB für sowas, die müsstest du auf Python umbiegen.
lunar

Eine solche Prüfung ist nicht frei von Race Conditions, insofern lässt sich das nicht verlässlich prüfen.

Die vernünftige Lösung wäre, dass das kopierende Programm nach Abschluss der Kopie die Datei für das verarbeitende Programm explizit freigibt, in dem z.B. der Pfad in eine geteilte Datenbank eingetragen wird, oder über eine IPC-Verbindung an das verarbeitende Programm übertragen wird.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lunar hat geschrieben:Die vernünftige Lösung wäre, dass das kopierende Programm nach Abschluss der Kopie die Datei für das verarbeitende Programm explizit freigibt, in dem z.B. der Pfad in eine geteilte Datenbank eingetragen wird, oder über eine IPC-Verbindung an das verarbeitende Programm übertragen wird.
Wenn man das hochladende Programm nicht modifizieren kann, ist das so nicht möglich.

Eine auch nicht absolut sichere, aber trotzdem wahrscheinlich hinreichend verlässliche Variante könnte darin bestehen, dass man über eine gewisse Zeit die Größe der Datei überprüft. Ändert sich diese nicht mehr, so ist davon auszugehen, dass der Upload beendet wurde.
lordnaikon
User
Beiträge: 58
Registriert: Dienstag 9. Februar 2010, 13:41

@Barabbas: vielen dank ich schau gleich mal nach und berichte.

@mkesper: dir auch danke, hab ich das richtig verstanden (ich kenn wmi leider nicht), dass ich damit nachprüfen kann ob ein programm ein handle auf ein file hat?

@lunar: mit dem gedanken hab ich auch schon gespielt, leider ist das kopier programm nicht von mir ..

/EDIT:

@/me: so ist es leider, die idee hatte ich auch schon (s.o.) aber iss wirklich nicht so elegant, aber vielleicht "hinreichend", wie du sagtest.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Bevor Du Dich mit WMI/Win-API calls, IPC und DBs rumärgerst, der Klassiker ist doch Lock-Write-Unlock. (Eigentlich ist das das Standardverhalten in Windows. :roll: )
Wie kopierst Du denn die Dateien? Falls Du es mit Python machst, kannst Du die Zieldatei selbst locken, innerhalb eines Batch-Skriptes könntest Du das Verhalten mit einer Lock-Datei simulieren.

Übrigens dürfte das Verschieben (move) einer Datei innerhalb eines Dateisystems atomar sein, d.h. mit Erscheinen des Dateinamens ist die Datei zugriffsbereit.
lordnaikon
User
Beiträge: 58
Registriert: Dienstag 9. Februar 2010, 13:41

@Barabbas: schönes tool kannte ich wie gesagt nicht, leider benötigt man dafür admin rechte :(

@jerch: ernsthaft? ich habs wie gesagt noch nicht probiert, ich dachte mir nur: (mensch darauf musst du achten).
ich werd mir gleich mal nen große datei schnappen und sie vielleicht auf nen usb stick kopieren(weils schön langsam ist) und mal sehen ob ich es öffnen kann, bevor es kopiert ist!

achso ich lese gerade von dir "dürfte das Verschieben (move) einer Datei innerhalb eines Dateisystems atomar sein" wäre es mit dem usb stick ja leider nicht .. naja muss es halt ne noch größere sein.

und nein das kopierprogramm ist nicht in python und auch nicht von mir.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

lordnaikon hat geschrieben:@mkesper: dir auch danke, hab ich das richtig verstanden (ich kenn wmi leider nicht), dass ich damit nachprüfen kann ob ein programm ein handle auf ein file hat?
Eher ein User, aber ansonsten: Ja.
Antworten