Mike: Datei öffnen unter WIN7

Hallo liebe Forengemeinde,

erst mal einen schönen Gruss an alle aktiven Foren-Mitglieder und ein Lob für das neue Design :-)

Stehe aktuell vor einem kleinen Problem wo ich nicht wirklich brauchbares über Tante google usw. gefunden habe (was durchaus auch an meinen Suchkriterien liegen könnte). Aber die Zeit drängt, daher hier mal die Frage in die Runde.

Szenario:

  • C++ Programm ruft (externe Software) auf um File A in B zu konvertieren (nicht im Hintergrund)
  • (externe Software) ruft Programm XY auf um sich File B zu betrachten

Nun ist es aber so, dass die erstgenannte SW sagt habe fertig, aber immer noch fleißig am schreiben von Ergebnis B ist, und die zweite SW (Viewer) dann eine Fehlermeldung bringt, dass er File B nicht öffnen kann (verständlich).

Welche Möglichkeiten gibt es dies abzufangen (bin kein wirklicher Programmierer-Experte)? Es muss auch nicht im C++-Code sein, mir würde eher vorschweben das Ganze auszulagern und für diesen Schritt z.B. ein Perl-Skript aufzurufen?

Kurz gesagt, welche Sprache gibt mir die (einfache) Möglichkeit und wie abzufragen ob eine Datei aktuell noch in Verwendung ist oder nicht?

Viele Grüße,
Mike

  1. Hallo,

    Szenario:

    • C++ Programm ruft (externe Software) auf um File A in B zu konvertieren (nicht im Hintergrund)
    • (externe Software) ruft Programm XY auf um sich File B zu betrachten

    das hört sich wahrscheinlich umständlicher an, als es wirklich ist.

    Nun ist es aber so, dass die erstgenannte SW sagt habe fertig, aber immer noch fleißig am schreiben von Ergebnis B ist, ...

    Dann sollte man genau diesen Fehler beheben. Wie Arbeitet das Programm, und worin besteht die "Fertig"-Meldung? Normalerweise würde ich das Beenden des Prozesses als solches Signal werten. Wenn das Programm also ein anderes aufruft, das die eigentliche Konvertierung macht, sollte es das Beenden dieses Kind-Prozesses überwachen. Möglicherweise teilt das Kindprogramm ja sogar über seinen Exit-Code mit, ob es erfolgreich war oder nicht.

    Aber mit dieser bisher sehr vagen Beschreibung kann man vermutlich keine sehr konkreten Hinweise geben.

    Ciao,
     Martin

    --
    F: Was ist wichtiger: Die Sonne oder der Mond?
    A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Dann sollte man genau diesen Fehler beheben. Wie Arbeitet das Programm, und worin besteht die "Fertig"-Meldung? Normalerweise würde ich das Beenden des Prozesses als solches Signal werten. Wenn das Programm also ein anderes aufruft, das die eigentliche Konvertierung macht, sollte es das Beenden dieses Kind-Prozesses überwachen. Möglicherweise teilt das Kindprogramm ja sogar über seinen Exit-Code mit, ob es erfolgreich war oder nicht.

      Das ist ja genau mein Problem Martin, bei dem Programm handelt es sich um eine (geschätzte) 4-5 Jahre alte exe (kein SourceCode, Firma pleite, null Support daher, aber auch nichts besseres im Umlauf laut AG). Von daher lässt sich hier nicht am eigentlichen Übel doktern. Es meldet ja auch einen Returncode 0 zurück, obwohl nicht wirklich fertig :-( Von daher suche ich nach einem Workaround abzufragen ob die Datei noch im Zugriff ist oder eben nicht.

      Aber trotzdem danke für Deine Antwort.

      Gruss.
      Mike

      1. Hi,

        bei dem Programm handelt es sich um eine (geschätzte) 4-5 Jahre alte exe (kein SourceCode, Firma pleite, null Support daher, aber auch nichts besseres im Umlauf laut AG). Von daher lässt sich hier nicht am eigentlichen Übel doktern.

        dann war deine Info, es handle sich "um ein C++-Programm", aber leider auch wertlos. Wenn du nur ein Executable hast, und keinen Quellcode, ist es schnurz, ob das seinerzeit in C, in BASIC, in Pascal oder meinetwegen in COBOL geschrieben wurde.

        Es meldet ja auch einen Returncode 0 zurück, obwohl nicht wirklich fertig :-(

        Das ist technisch gesehen ein Widerspruch. Wenn das Programm einen Return Code liefert, ist es definitiv beendet. Ich könnte mir höchstens vorstellen, dass Windows selbst hier durch seinen Cache die letzten Schreibvorgänge auf die neue Datei verzögert. Dann allerdings sollte ein konkurrierendes Öffnen zum Lesen wiederum möglich sein. Sehr merkwürzig ...

        Von daher suche ich nach einem Workaround abzufragen ob die Datei noch im Zugriff ist oder eben nicht.

        Die einzige Möglichkeit, die mir einfällt: Stur probieren, und wenn fopen() (oder CreateFile() in Windows) fehlschlägt, eine gewisse Zeit abwarten und dann erneut versuchen. Das natürlich mit einem Zähler oder einem Zeitlimit absichern, damit das Programm bei schwerwiegenden Fehlern nicht endlos hängt.

        Oder wie wäre es mit einer Batchdatei als Krücke, die streng sequentiell erst das Konvertierungstool aufruft, dann den Viewer?

        So long,
         Martin

        --
        Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
          (Gernot Back)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Oder wie wäre es mit einer Batchdatei als Krücke, die streng sequentiell erst das Konvertierungstool aufruft, dann den Viewer?

          Danke Martin, ich möchte ja auch am liebsten den ganzen Aufruf auslagern (sprich das C Programm soll seinen Job machen) und dann eine Batch-Datei oder was auch immer (Skript) aufrufen und den Rest machen lassen (Konvertierung und Viewer starten, hilft aber so auch nicht, da ja die Konvertierung sagt fertig, obwohl nicht). Einen Counter habe ich auch schon probiert (Änderung mtime), funktioniert auch soweit, allerdings wird diese Lösung so von Seiten AG nicht akzeptiert. Und ich weiß nicht ob es hier ggf. bessere Lösungsmöglichkeiten gibt?

          Gruß,
          Mike

          1. Moin Moin!

            Martin hat Recht, irgendwo ist Deine Beschreibung nicht konsistent mit dem normalen Verhalten von Windows-Programmen. Es könnte natürlich sein, dass die EXE-Datei, die Du aufrufst, erst einmal einen neuen Prozess anlegt, der die eigentliche Arbeit macht, und sich dann frühzeitig wieder beendet. Das kannst Du im Taskmanager und mit Tools wie dem Process Explorer nachvollziehen. In dem Fall mußt Du ein wenig tricksen:

            Wenn der Konverter für die Konvertierung irgendeine Art von Fenster oder Dialog anzeigt, und dieses Fenster erst dann schließt, wenn es wirklich fertig ist, hast Du schon fast gewonnen: Konverter im Hintergrund starten, warten bis ein Fenster mit passendem Titel und passender Window-Class erscheint (FindWindowEx), warten bis das gefundene Fenster wieder verschwindet (nochmal FindWindowEx).

            Wenn der Konverter ohne Fenster arbeitet, mußt Du dich vielleicht mit den Funktionen für die Steuerung und Überwachung von Prozessen herumschlagen, schlimmstenfalls mit obskuren Debug-Funktionen.

            Manchmal reicht auch schon so etwas wie

            start "dummy" /WAIT c:\bin\konverter.exe input.foo output.bar

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".