Aus Dateiname Ordner erstellen

  • Hier kann z.B. auch ein regulärer Ausdruck verwendet werden :
    $target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '(.*)\..*', "$1") & '\'

    Wenn ich das verwende erstellt er brauchbare Ordner, aber er verschiebt die Datei nicht hinein

  • Wenn ich das verwende erstellt er brauchbare Ordner, aber er verschiebt die Datei nicht hinein

    Ich habe in das Skript von Moombas mal den regulären Ausdruck eingebaut :

    In meiner Teststruktur wird alles korrekt verschoben (Ausnahme, wie gesagt, der Sonderfall, dass Dateien ohne Extension vorhanden sind).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Bei meinen Test erstellt er die Ordner korrekt, eine .au3 Datei verschiebt er in den Ordner aber ohne Extension,

    eine .mp4 verschiebt od. kopiert er gar nicht in die erstellten Ordner

  • Bei meinen Tests erstellt er die Ordner korrekt, eine .au3 Datei verschiebt er in den Ordner aber ohne Extension, eine .mp4 verschiebt od. kopiert er gar nicht in die erstellten Ordner

    Das kann ich nicht nachvollziehen.

    Verwendest Du wirklich das o.a. Skript, oder hast Du Teile davon in dein eigenes übernommen ?

    Ich habe den Eindruck, dass wir es hier mit dem häufig (von z.B. Andy ) beschriebenen https://de.wikipedia.org/wiki/XY-Problem zu tun haben.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Meine Gedanken dazu (die alle nicht das beschriebene Problem betreffen):

    • Aktuell werden auch Ordner erkannt und prozessiert (ja das Pattern *.* bei FileFindFirstFile ändert daran nichts...).
      Das fällt erst einmal nicht auf, da die Funktionen wie FileMove hiermit scheitern aber besser wäre es dennoch bei FileFindNextFile mit @extended prüfen ob es sich um Dateien handelt.
    • Das DirCreate() kann man sich sparen, wenn man beim FileMove() $FC_CREATEPATH setzt.
    • Das Pattern kann auch so angepasst werden, dass es sowohl für Dateien mit Endung, als auch ohne Endung funktioniert:
    AutoIt
    $target = @ScriptDir & '\' & StringRegExpReplace($sFileName, '\.[^\.]+$', '') & '\'
    • $iResult wird deklariert und definiert aber nie verwendet.

    Ansonsten schlage ich in die selbe Kerbe wie Musashi : Um das zu debuggen musst du uns das komplett unangetastete Skript zeigen, welches den Fehler erzeugt und die tatsächlichen (keine anonymisierten) Namen der Dateien in dem Ordner auflisten.

  • Verwende dieses Script, da macht er alles mit .au3 Dateien richtig, aber die .mp4 Dateien will er nicht in den erstellten Ordner verschieben.

    Vielleicht hat es was mit der größe der Dateien zu tun, hab da keine Ahnung.

  • Verwende ich dieses Script, da macht er alles mit .au3 Dateien richtig, aber die .mp4 Dateien will er nicht in den erstellten Ordner verschieben.

    Vielleicht hat es was mit der Größe der Dateien zu tun, hab da keine Ahnung.

    Mit der Größe hat es nichts zu tun.

    Ich habe in meine Teststruktur eine .mp4-Datei mit 1GB eingefügt, und die wird problemlos in den erstellten Ordner verschoben. Generell gibt es keinen Grund, warum Dateien mit der Extension .au3 funktionieren, .mp4-Dateien hingegen nicht.

    Kopiere bitte mal folgendes Skript in den Ordner wo deine Dateien liegen und führe es aus.

    Anschließend poste einen Screenshot des Arraydisplay-Fensters.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Nein - die Klammern sind überhaupt nicht dein Problem.
    Das Problem ist das Leerzeichen vor dem Punkt.
    Ordnernamen dürfen nicht auf Leerzeichen enden, deswegen wird ein Ordner ohne abschließendes Leerzeichen erzeugt aber der FileMove-Befehl schläg fehl, da dort das Leerzeichen noch drin steht.

    Diesen Fall muss man also bei der Erzeugung des Zielordnernamens noch mit beachten:


    Und jetzt verstehst du hoffentlich auch mal warum wir ganz konkret nach den tatsächlichen Dateinamen fragen.
    Wir fragen nicht zum Spaß.

  • Und bei meinenm Beispiel Code war die Prüfung ob ein Ordner existiert bereits drin (sonst wird eben keiner erstellet, nur verschoben; Zeile 21).
    Aber das man vor dem . ein Leerzeichen haben könnte habe ich in der Tat nicht bedacht...auf so eine Idee würde ich nie kommen :Glaskugel:

    Danke an die Anderen, dass sie sich dessen angenommen haben ;)

  • Und bei meinenm Beispiel Code war die Prüfung ob ein Ordner existiert bereits drin (sonst wird eben keiner erstellet, nur verschoben; Zeile 21).

    War das an mich adressiert?
    Mein Punkt war, dass eben diese ganze Zeile gar nicht notwendig ist, da FileMove() diese Funktionalität gleich mitbringt.
    Einfach eine 8 als 3. Parameter eintragen und fertig.

    Das würde auch ein weiteres Randphänomen in deinem Skript mit beseitigen:
    Erstelle mal einen Ordner (keine Datei) mit dem Namen Mein.Ordner und schau was mit der DirCreate-Zeile daraus gemacht wird.

    Aber das man vor dem . ein Leerzeichen haben könnte habe ich in der Tat nicht bedacht...auf so eine Idee würde ich nie kommen :Glaskugel:

    Ich ebenso niemals. Deshalb hab ich ja so auf die konkreten Namen gedrängt.
    Man versucht ja immer jeden Randfall gleich mit zu bedenken aber es wird immer Fälle geben, an die man eben nicht gedacht hat.
    Daher kommt kein Programm ohne anschließende Testung aus.

  • Das würde auch ein weiteres Randphänomen in deinem Skript mit beseitigen:
    Erstelle mal einen Ordner (keine Datei) mit dem Namen Mein.Ordner und schau was mit der DirCreate-Zeile daraus gemacht wird.

    Also als ich das mit einer Datei als basis mit 2 Punkten im Namen gestestet (da_block.png.test) habe (der Ordnername hat dann zwangsläufig auch einen: da_block.png), lief das Einwandfrei.
    Was macht es denn deiner Meinung nach (lerne gerne wieder was dazu ;))?

  • Ordner - nicht Datei.
    Wenn du einen Ordner mit dem Namen Mein.Ordner im Verzeichnis hast (z.b. bei einem erneuten Durchlauf), dann wird ein leerer Ordner namens Mein erzeugt.
    Umgehen kann man dies, wie oben vorgeschlagen, durch einen Extra-Check ob Ordner gefunden wurden oder auch durch das Weglassen der DirCreate-Zeile und stattdessen dem Parameter bei FileMove.

  • Ich hab das schon verstanden, die Datei ist ja nur Quelle als Namensgeber, mehr nicht.
    Beispiel:
    Dateiname: da_block.png.test
    Resultierender Ordnername: da_block.png

    Das kann ich nicht nachvollziehen mit meinem Skript (dort ist die Prüfung ja drin ob der entsprechende Ordner bereits existiert).
    Wenn ich jedoch, wie von dir angegeben, "$FC_CREATEPATH" in Filemove verwende (und das dircreate auskommentiere), wird kein Ordner erstellt. > Slashes richtig rum gedreht und geht, war mein Fehler, nachvollziehen kann ich deine obige Aussage jedoch nicht.

  • Ich hab das schon verstanden, die Datei ist ja nur Quelle als Namensgeber, mehr nicht.
    Beispiel:
    Dateiname: da_block.png.test
    Resultierender Ordnername: da_block.png

    Das kann ich nicht nachvollziehen mit meinem Skript (dort ist die Prüfung ja drin ob der entsprechende Ordner bereits existiert).
    [...] nachvollziehen kann ich deine obige Aussage jedoch nicht.

    Bis hierhin ist ja wie gesagt auch alles korrekt so wie es sein soll. Bis hierhin hast du ja keine Ordner mit Punkten im Namen drin.
    Nun nach Skriptausführung hast du jedoch einen Ordner(!) namens "da_block.png" im Verzeichnis.
    Nun führe dein Skript erneut aus.
    Resultat: Nun wird ein Ordner "da_block" erzeugt und es kommt folgendes Phänomen von FileMove() zum Tragen:
    Werden als Quelle und Ziel zwei vorhandene Ordnernamen angegeben, dann werden alle Dateien aus dem Quellordner in den Zielordner verschoben.

    Das heißt: Nun hast du einen Ordner namens "da_block", in welchem die Datei da_block.png.test liegt. Zusätzlich hast du einen leeren Ordner namens da_block.png.
    Stattdessen war das gewünschte Ziel: Ein Ordner namens da_block.png in welchem die Datei da_block.png.test liegt.

    Um das zu lösen musst du wie mehrmals gesagt, Ordner von der Prozessierung ausschließen.

    Edit: Vielleicht verstehe ich langsam worauf du hinausmöchtest: Nur allein mit dem 3. FileMove-Parameter löst man das Problem tatsächlich nicht. Es bedarf zusätzlich der Abfrage ob es sich um einen Ordner handelt (siehe mein Skript oben).

    Einmal editiert, zuletzt von AspirinJunkie (4. Dezember 2023 um 10:58)

  • Möp, jetzt weiß ich warum ich das nicht nachvollziehen konnte.
    Ich hatte die vorhandene da_block.png erweitert und getestet.
    Den Ordner "da_block" gab es daher schon (ebenso die entsprechende Datei) und daher auch keine Probleme.

    Ja, schon blöd und du hast recht ;)
    Man sollte die Testumgebung halt frei von solchen Möglichkeiten halten. :saint:

    Einmal editiert, zuletzt von Moombas (4. Dezember 2023 um 11:07)