GAMES von Netzwerkfreigabe kopieren

  • Ich beschäftige mich seit ca. 2 Wochen mit AutoIt und bin begeistert.
    Nun da ich x Scripte geschrieben habe die mit Programminstallationen zu tun haben, möchte ich einen Schritt
    weiter nach vorne machen.

    Ziel: Einen Ordner von einer Netzwerkfreigabe mit Fortschrittsanzeige zu kopieren.


    1. Der User soll am Anfang auswählen können ob das Programm alles selbständig machen soll, also in dem Sinne, überprüfen auf
    welcher Partition/HD noch genug Platz ist für das gewünschte Game, oder manuell den Pfad angeben, shortcut ja/nein.

    2. Der user sollte das Skript/Exe ausführen, danach soll er einen Pfad angeben können wohin das Game installiert werden soll.
    3. Er soll auswählen können ob ein Shortcut angelegt werden soll.

    Ich habe bereits was gebastelt, dass eigentlich simple funktioniert nur halt ohne Erweiterten Ansatz :)

    [autoit]

    ;Delete exsisting directory
    DirRemove("C:\S_GAMES\SCBW", 1)
    MsgBox(48, "SATINEZ.NET - Install StarCraft Broodwar", "Delete existing directory..", 5)

    [/autoit][autoit][/autoit][autoit]

    ;Create directory
    DirCreate("C:\S_GAMES\SCBW")
    MsgBox(48, "SATINEZ.NET - Install StarCraft Broodwar", "Create directory..", 5)
    MsgBox(0, "SATINEZ.NET - Install StarCraft Broodwar", "Copy files from Server......(5min)", 5)

    [/autoit][autoit][/autoit][autoit]

    ;Copy directory
    DirCopy("\\server01\games\scbw\", "C:\S_GAMES\SCBW", 1)

    [/autoit][autoit][/autoit][autoit]

    ; Create the shortcut
    FileCreateShortcut("C:\S_GAMES\SCBW" & "\starcraft.exe",@DesktopDir & "\StarCraft.lnk","C:\S_GAMES\SCBW","", ":)")

    [/autoit][autoit][/autoit][autoit]

    ; Read the path of the shortcut
    $sc_path = FileGetShortcut(@DesktopDir & "\StarCraft.lnk")
    MsgBox(48, "SATINEZ.NET - Install StarCraft Broodwar", "Shortcut created from file: "& $sc_path[0], 5)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(48, "SATINEZ.NET - Install StarCraft Broodwar", "StarCraft Broodwar installed completly!", 5)

    [/autoit][autoit][/autoit][autoit][/autoit]

    Wie gesagt es funktioniert ganz simple, und das möchte ich gerne perfektionieren.

    Was brauche ich alles dazu? Kennt sich jemand damit aus? Kann ich vielleicht mit MultiFileCopy was anfangen?

    Einmal editiert, zuletzt von satinez (25. Januar 2009 um 23:43)

  • Also ich hab jetzt wieder ein bissle Zeit :)

    1. Wie bekomme ich das hin, das er die lokalen Laufwerke abfragt ob eine Mindestgrösse an Freien Speicher vorhanden ist?
    2. Wo und wie müsste ich jetzt die Funktion einbauen von MultiFileCopy?


    greet;s satinez

  • zu 1.

    Spoiler anzeigen
    [autoit]

    $var = DriveGetDrive( "all" )
    If NOT @error Then
    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
    MsgBox(4096,"Drive " & $i, $var[$i])
    MsgBox(4096,"Drive " & $i,DriveSpaceFree( $var[$i]))
    Next
    EndIf

    [/autoit]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Hallo danke es klappt.

    Leider muss ich feststellen, wenn ich kleine Pakete kopieren will ~300MB, dann kommt für 10Sekunden der Tooltip mit dem Text "Verzeichnis wird eingelesen" und dann wird kopiert.

    Jetzt habe ich ~20GB zu kopieren, da braucht das Einlesen schon ne ewigkeit, mache ich was falsch?
    Habe es sogar mit dem Originalen MultiFileCopy von Oscar probiert, da geht das einlesen auch so lange :(

    Wenn ich DirCopy verwende, kopiert er es sofort..was ist da anders?

    lg

    Einmal editiert, zuletzt von satinez (19. Januar 2009 um 23:25)

    • Offizieller Beitrag

    Entweder...oder!
    MultiFileCopy muss erstmal die Verzeichnisstruktur einlesen. Wenn das Quellverzeichnis viele kleine Dateien in zahlreichen Unterverzeichnissen beinhaltet, dann dauert das halt so lange.
    Das läßt sich nicht verhindern. Irgendwoher müssen die Daten (Größe, Dateinamen) ja kommen.
    DirCopy kann da gleich loslegen, weil es diese Daten nicht anzeigt. Du musst Dich also entscheiden...

  • Das heisst, er braucht nur so lange, weil er die Daten dann im GUI anzeigen soll?
    Wenn ja, würde es dann auch gehen, wenn ich nur den Progressbalken anzeigen würde?

  • Danke für die Antwort.
    Schade, ich begann dieses MultiFileCopy zu mögen :)

    Gibts dann eine andere Möglichkeit, um anzuzeigen wie weit der Kopiervorgang ist?
    Eventuell würde auch der Kopierdialog von XP reichen, oder ist die nicht möglich?

    Sorry für die doofen fragen, es interessiert mich halt nunmal xD

  • hmm, schwierig, ich würde da vlt. die Gesamtgröße der Ursprungsdaten auslesen, und regelmäßig (AdLibEnable) die Größe des Ziels überprüfen. Oder du machst einfach ne marquee-progressbar.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Ja das Problem ist so wie du gesagt hast Oscar, viele Dateien, in vielen Ordnern :)

    Dieses "marquee-progressbar" , was ist das?
    Und um den Kopierdialag von Windows XP zu benutzen geht wohl nicht so einfach?

    Wenns ueberhaupt nicht geht, dann mach ich halt das normal ueber DirCopy und wenns fertig ist ist es fertig :)

    • Offizieller Beitrag

    @satinez: Verändert sich die Anzahl und/oder die Größe der zu kopierenden Dateien? Oder ist der Ordner (plus alle Unterordner und Dateien) immer der Gleiche?
    Im letzteren Fall könnte man ja einmalig die Größe und Anzahl aller Dateien ermitteln und diese Daten in einer Textdatei ablegen, die dann vor dem Kopiervorgang geladen wird und somit die Daten für MultiFileCopy liefert.
    Dann hättest Du beides (Kopiervorgang mit Fortschrittanzeige und einen sofortigen Start der Kopieraktion).

  • ciao! Es gibt da Ordner, die immer gleich bleiben. Wenn ich natürlich ein Update mache verändert es sich...

    Das mit der Text datei würde ich gerne probieren, wenn das einfach umzusetzen ist, denn ich verstehe noch nicht viel von AutoIt :D

    Wie ist denn das Vorgehen einer solchen Funktion?
    Also ich möchte eigentlich nur mal wissen, wie du dir das vorgestellt hast, oder hast du ein ähnliche Funktion schon einmal gemacht?

    Ich nehme mal an das der Ordner einmal (1) eingelesen werden muss und Dateiname und Dateigrösse in ein Array schreibt und dann in eine TXT

    Dann müsste man nur dem MultiFileCopy die TXT als Parameter angeben?

    • Offizieller Beitrag

    Ich stelle mir das so vor:

    - Die Funktion "_GetFilesFolder_Rekursiv" über das Verzeichnis laufen lassen, dass kopiert werden soll.
    - Das erstellte Array in eine Textdatei speichern.
    - Die Funktion "_MultiFileCopy" entsprechend anpassen, dass (wenn vorhanden) die Daten aus der Textdatei geholt werden.

    MultiFileCopy würde also vorher prüfen, ob sich eine solche Textdatei im Hauptpfad des zu kopierenden Verzeichnis befindet. Wenn ja, werden die Daten aus der Textdatei gelesen, wenn nein, wird die Funktion "_GetFilesFolder_Rekursiv" aufgerufen.

    Edit: Es gibt eine neue Version von _MultiFileCopy, in der ich diese Änderungen vorgenommen habe.