Datei von Netzlaufwerk kopieren mit Progressbar

  • Hallo Gemeinde,


    ich möchte regelmäßig eine größere Datei(ca. 600MB) von einem Netzlaufwerk auf die Festplatte kopieren.
    Dies hatte ich mit folgendem Code versucht:


    Leider wird immer eine Fehlermeldung ausgegeben die aussagt: Zugriff verweigert. Zugriff auf das Share existiert. Mit Filecopy würde es funktionieren, da habe ich aber keine Progressbar.

    Könnte mir bitte jemand auf die Sprünge helfen was ich da übersehe:?:

    Einmal editiert, zuletzt von SOLVE-SMART (17. April 2024 um 09:04)

  • Hast Du den Code selbst entwickelt oder ist dies eines der vielen ProgressBar Beispiele aus dem engl. Forum?

  • Moin,

    die Routine entstammt offenbar den Beispielen für _WinAPI_MoveFileEx(). Leider hast Du Dir für den Parameter $iFlags einen 'unglücklichen' Wert ausgesucht.

    5 entspricht $MOVE_FILE_REPLACE_EXISTING (0x0001) + $MOVE_FILE_DELAY_UNTIL_REBOOT (0x0004).

    $MOVE_FILE_DELAY_UNTIL_REBOOT ist laut Doku für Dateien auf Netzlaufwerken nicht zulässig. Außerdem soll, wenn eine Datei auf ein anderes Laufwerk kopiert werden soll, das Flag MOVE_FILE_COPY_ALLOWED (0x0002) gesetzt werden.

    Ein 'glücklicherer' Wert für $iFlags wäre meiner Meinung nach deshalb 3.

  • Hallo Water,

    ich habe den Code tatsächlich aus dem Forum und nutze ihn schon lange im Rahmen einer kleinen Datensicherung.
    Dort aber erstelle ich ein ca. 15GB großes zip-Archiv und kopiere es auf ein Netzlaufwerk. Funkioniert auch super.

    @ Musashi: vielen lieben Dank für den Tipp. Schau ich mir an...

  • Hallo Velted,

    vielen lieben Dank für dein Input.

    Ich hatte ursprünglich die 3 als Flag drinstehen aber nachdem diese Fehlermeldung erschien habe ich die Flags durchgetestet. Leider
    ohne Erfolg. Bin dann bei 5 "stehen" geblieben. Also auch mit der 3 kommt "Kein Zugriff". Die Datei führe ich als lokaler Admin aus
    und Zugriff auf das Share besteht.

    Weiß jemand wie ich feststellen kann, welcher Zugriff da gemeint sein könnte?

  • Hallo Velted,

    es scheint als das die Fehlermeldung doch am Share liegt. Ich habe in der Zwischenzeit nämlich den Vorgang mit meiner "Datensicherung" getestet(die Datei vom dortigen Share auf den lokalen Rechner kopieren)
    und der Vorgang hat funktioniert. Ich suche jetzt zuerst mal warum es beim anderen Share nicht geht... Am Code liegt es wie es aussieht eher nicht.

  • Hallo,

    es steht fest: es liegt tatsächlich an den Dateiberechtigungen. Ich wollte eine andere Testdatei auf dem Share ablegen, das ging ebenfalls nicht.
    Offenbar habe ich nur Zugriff ohne Schreibberechtigung. Daher kommt dort die Fehlermeldung "Kein Zugriff", während sie auf meinem Home-LW nicht kommt.

    Projekt eingestampft - Thema Erledigt!!!

  • Eine Frage Noch:

    ist es richtig das Der Code nur verschiebt?

    Der Flag 2 und oder 3 hat keine Auswirkung darauf. Meine Testdatei wird immer nur verschoben...
    Weiss jemand wie ich damit kopiere könnte?


    Habe gerade in der Hilfe gesehen das es auch ein _WinAPI_CopyFileEx gibt. Das wird die Lösung sein...

    Einmal editiert, zuletzt von hipfzwirgel (17. April 2024 um 14:15)

  • So, mit _WinAPI_CopyFileEx funktioniert das kopieren...

    eine Frage noch an die Gemeinde:

    Warum wird die Progressbar gestoppt sowie i-eine andere Fenster-Aktion durchgeführt wird?

  • Kommt darauf an, wie genau dein Code aussieht.

    Aber das Grundproblem liegt darin, dass AutoIt Single-Threaded ist. Es kann also immer nur ein Code gleichzeitig ausgeführt werden.
    Man kann mit bestimmten (Interrupt-) Methoden (wie Adlibregister, dein _ProgressProc,...) Code "nebenbei" ausführen, aber das sorgt auch nur dafür, dass der Hauptcode angehalten wird, die Funktion durchläuft und dann der Hauptcode weiter ausgeführt wird.
    Sleep-Befehle in solchen "Interrupt" Methoden sind also sehr schlecht, weil dadurch die Hauptschleife angehalten wird und ähnlich sollte man aufpassen, dass man den Hauptcode nicht zu lange blockiert.
    Wenn du deinen Code postest, können wir dir da bei der Optimierung helfen.

    In anderen Programmiersprachen kann man asynchron programmieren (was der Art von AutoIt am ähnlichesten ist), wobei auf einem Kern abwechselnd verschiedener Code ausgeführt wird.
    Dann gibt es multithreading, was meist genutzt wird, um Dinge parallel auszuführen und auch mehrere unterschiedliche CPU-Kerne zu nutzen, aber gleichzeitig den Arbeitsspeicher zu teilen.
    Zum Schluss gibt es noch multiprocessing, wo man mehrere Programme nebeneinander laufen lässt, die miteinander kommunizieren (Networking (TCP)/Files/...). Das könntest du hier auch gut verwenden, wenn das "asynchrone" in AutoIt nicht so gut klappt. Dann würdest du deine Anwendung mit Parametern nochmal aufrufen, die dann den Download durchführen und mit deinem Tool (Mit TCPAccept/TCPSend/TCPReceive/...) die Prozentzahl kommunizieren, abbrechen, pausieren,... . Da du dafür aber einen kleinen Server/Client programmieren müsstest, wäre das aufwendiger.

  • Progessbar mit Robocopy

    Wie so viele vor mir, habe auch ich das Rad neu erfunden und eine Progressbar für den Kopiervorgang "erfunden"....

    In meinen Fall seht ein Robocopy dahinter (ist ja inzwischen Standard unter Windows):
    Die Funktion ist nur C&P und muss auf die jeweiligen Bedürfnisse angepasst werden!


    Im Hauptprogramm wird jetzt die PID "überwacht" und der Output Dos Fenster ausgelesen, in eine Zahl umgewandelt und mittels Progressbar dargestellt.

    Robocopy gibt im Grunde nur mehr den Prozent-Fortschritt aus....und der geht immer von 0% bis 100% ...
    Noch ein Vorteil ist dass es als Prozess läuft und damit das eigentliche AutoIT-Programm nicht "warten" muss...

    Der Code ist schon etwas älter und naja, nicht so gut dokumentiert, dieht also eher als Idee als copy & paste Lösung.

    lg
    Racer

  • Hallo Kanashius und Racer,


    zunächst möchte ich mich bei euch für eure Beiträge bedanken.


    Ich glaube fast, das meine Frage etwas missverstanden wurde. ich will noch mal erklären:


    Der Kopiervorgang läuft und die Progressbar wird auch angezeigt. Sobald ich aber i-ein anderes Fenster, manuell bewege, öffne, schließe oder das Progressbar-Fenster selber mit der Maus
    anfasse, wird die Progressbar gestoppt (FehlerMeldung beim Anklicken des PB-Fensters: Not Responding). Der Kopiervorgang indes geht weiter.