Datei von einem Netzlaufwerk "downloaden" und alte datei überschreiben



  • Hallo,

    ich möchte in meinem programm eine art "auto-update" einbauen.
    da es ganz einfach sein soll, dachte ich mir, ich richte einen ordner im netzwerk ein, wo ich immer die neue programm - exe reinstelle, und mien programm überprüft beim start, ob eine neue datei drinliegt, und wenn ja, dann zieht er diese vom ordner, überschriebt die alte exe und startet dann wieder mit der neuen!

    wie könnte ich das lösen?
    das herunterladen?

    und wie könnte ich das mit dem überschrieben und starten der neuen exe machen?Mit einem batch?

    wäre für hilfe dankbar!



  • Hallo

    das geht so nicht. Ein laufendes Programm kann nicht seine eigene Exe überschreiben, weil die zu diesem Zeitpunkt von Windows aus als geöffnet und damit als schreibgeschützt markiert ist.
    Es gibt zwei Möglichkeiten :
    - du schreibst ein extra Programm, das nur dazu da ist, auf Updates zu prüfen und wenn nötig die eigentliche Exe zu überschreiben. Danach wird automatisch die eigentliche Exe gestartet
    - du lagerst soviel wie möglich von deinem Programm in eine DLL aus, die dynamisch eingebunden wird. Dann kannst du zur Laufzeit vor dem Aufruf der DLL diese auf Updates überprüfen und auch überschreiben

    Das überschreiben ist einfach mit CopyFile möglich, mit FailIfExists auf false.

    bis bald
    akari



  • ja das scheint mir logisch!

    Also mit den dlls geht wohl leider nicht mehr, da das programm schon zu groß und uumfangreich ist, und ausserdem sehr viel VCL benutzt!

    ALso könnte ich es so machen:

    1. Programm starten, und im Netzwerk nach neuer Exe suchen, wenn vorhanden, das Updateprogramm starten und die laufende Instanz beenden
    2. Updateprogramm kopiert datei vom Netzwerk auf die Festplatte
    3. Updateprogramm startet neue Instanz des Programmes und beendet sich dann selber

    geht das so?

    Und nochwas, wie kann ich auf einen festen (laufwerksbuchstabe etc bekannt und gleichbleibend) netzwerkordner zugreifen? Wie auf einen lokalen ordner, einfach den pfad angeben (h:\\Ordner\\Dateiname.exe)?



  • Hallo

    ...
    geht das so?

    Grundsätzlich ja. Allerdings muß der Aufruf des Update-Programms sicherstellen, das das eigentliche Programm dann auch wirklich geschlossen ist. (also kein nebenläufiger Aufruf)

    Und nochwas, wie kann ich auf einen festen (laufwerksbuchstabe etc bekannt und gleichbleibend) netzwerkordner zugreifen? Wie auf einen lokalen ordner, einfach den pfad angeben (h:\\Ordner\\Dateiname.exe)?

    Ja

    bis bald
    akari



  • ok, soweit alles klar!

    nur mit dem einsatz von CopyFile() hapert es noch"

    ich rufe CopyFile auf, der erste Parameter ist der Pfad zum Netzlaufwerk samt Datei, der 2te Parameter ist de Pfad zum Programmordner samt Dateiname, und 3ter ist false!

    Allerdings überschriebt er nix und bringt keine Fehlermeldung!

    was könnte ich falsch machen?



  • achja, schließen tu ich das eigentliche programm, nach dem start der updater.exe, kann dass das problem sein?

    ShellExecute(0,"open",executePath.c_str(),"update",0,SW_SHOWNORMAL);
     Application->Terminate();
    


  • Ja, das kann das Problem sein. Evtl. solltest du im Updateprogramm testen, ob dein Programm noch läuft. Bei CopyFile bekommst du keine Fehlermeldung. Du solltest den Rückgabewert auswerten und bei false mit GetLastError() versuchen den Fehler rauszubekommen.



  • Braunstein schrieb:

    Ja, das kann das Problem sein. Evtl. solltest du im Updateprogramm testen, ob dein Programm noch läuft.

    und wie mache ich das?
    als fenster ist es nichtmehr vorhanden (also ein FindWindow() oder so geht dann ja nciht mehr oder)?


Anmelden zum Antworten