Announcement

Collapse
No announcement yet.

Datei öffnen/lesen, ohne sie zu blockieren für anderen Prozess

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datei öffnen/lesen, ohne sie zu blockieren für anderen Prozess

    Hallo Forum,

    ich müsste kontinuierlich den Inhalt einer Textdatei (Logdatei, CSV-Format) einlesen und wo anders speichern, während diese Datei von einem anderen Programm beschrieben wird. Das Problem dabei ist, dass das andere Programm, welches die Datei beschreibt, nach einer gewissen Zeit eine Fehlermeldung anzeigt, wenn man versucht, die Datei zu kopieren. Es kommt eine Dialogbox "Datei datei.csv kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird". Getestet habe ich das mit COPY, XCOPY, robocopy und rsync. Das Verhalten ist identisch.

    Versuch 2: Umleiten. Der Befehl "tail -f datei.csv > datei2.csv" macht im Prinzip genau das, was ich suche. Das ganze läuft unter Windows 7. Ich habe die Tail-Variante schon mit dem tail aus dem Microsoft SDK versucht und mit Cygwin. Bei beiden kommt sofort die o.g. Meldung. Ein Versuch mit einem Powershell-Tail-Nachbau blockiert ebenfalls. Mit "Tail for Win32" hingegen, kann ich dauerhaft die Datei einlesen und darstellen. Das Problem dabei: Das Programm kann den Inhalt nur anzeigen aber nicht in eine neue Datei umleiten...

    Versuch 3: Über Volumenschattenkopie. Da bin ich momentan noch dran, kann aber schon feststellen, dass das relativ zäh wird. Evlt. wäre das eine Lösung.

    Versuch 4: Über ein eigenes Tail in c++ o.ä.. Wenn ich über fopen( "datei.csv", "r") die Datei öffne, kommt ebenfalls die Meldung oben. Ein testweises Öffnen über "w" (Schreibzugriff) zeigt beim Programm einen "E/A-Fehler 32" an. Irgendwie müsste es doch einen Modus geben, der genau wie bei "Tail for Win32" die Datei öffnet und noch blockiert. Wisst ihr, wie das gehen könnte?

    Oder habt ihr noch eine andere Idee, wie ich die Datei abgreifen könnte?

    Update (29.04.2015): Die Variante mit den Volumenschattenkopien scheint zu funktionieren. Die Messungen liefen gestern sowie heute Vormittag schon eine Weile durch. D.h. das könnte ein Workaround sein. Generell würde ich mich aber trotzdem dafür interessieren, wie das "Tail for Win32" die Datei öffnet, ohne dass das andere Programm dadurch blockiert wird.
    Falls da jemand "sachdienliche Hinweise" hat, würde ich mich darüber freuen.

    Update (05.05.2015): Ich habe nun die Lösung! Es gibt auf Sourceforge den Quelltext von "Tail for Win32" und dort wurde ich fündig, wie die Datei geöffnet wird. Ich habe das in einem kleinen C++ Programm nachgebaut und es funktioniert damit ebenfalls.
    Code:
    hFile = CreateFile (szFileName, 
                                  GENERIC_READ, 
                                  FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                  NULL, 
                                  OPEN_EXISTING, 
                                  FILE_ATTRIBUTE_NORMAL, 
                                  NULL);
    Der Knackpunkt ist das FILE_SHARE_READ | FILE_SHARE_WRITE.

    Grüße,
    Wursel
    Zuletzt editiert von Wursel; 05.05.2015, 15:49.
Working...
X