Dateinamen auf Duplikate überprüfen

  • Hallo allerseits,
    ich habe für ein Programm eine Vorlage mittels AutoIT erstellt. In diesem Skript werden zur Zeit vier Kalenderjahre in einer GUI zur Auswahl angeboten. In der gleichen GUI wird auch ein Dateiname abgefragt.
    Das ganze wird in der Folge zur Erstellung einer gewissen Ordnerstruktur mit diversen xml Dateien und speziellen Programmdateien mit der Endung *.rec verwendet. Das eigentliche Programm nutzt diese Vorlage für den Aufbau eines Falls in einer Datenbank.
    Maximal Sorgfalt muss auf den Dateinamen verwendet werden. Dieser muss einmalig sein. Das Skript war bisher so aufgebaut, dass der Dateinamen verglichen wurde und bei einer Namensgleichheit das Skript abgebrochen oder neu gestartet werden konnte.
    Nachdem alle kleinen Macken beseitigt sind, wollte ich die Namensüberprüfung korrigieren. Das mit dem Neustart des Skriptes hat mir so nicht gefallen. Mein Plan war daher, die Namensüberprüfung wie gewohnt durchlaufen zu lassen, aber mittels einer Inputbox einen neuen Namen vergeben zu können.
    Das funktioniert auch so weit. Wenn ich den Namen der als Duplikat gefunden wurde erneut eingebe, läuft das Skript durch und überschreibt den Fall der in dem entsprechenden Laufwerk abgelegt wurde und was noch schlimmer ist, dass bei versehentlicher Übernahme der Vorlage in das Programm Probleme in der Datenbank auftreten.
    Ich müsste das so regeln, dass bei einer Namenseingabe in der Inputbox der dort vergebene Name auch wieder überprüft wird. Und das solange bis ein eindeutiger Name vergeben worden ist.

    Spoiler anzeigen
    Code
    Global $datum, $name, $Neuername, $Dateiname
    if $Dateiname = ("I:\AIS_" & $Datum & $Dateiname) or ("I:\AIS_" & $Dateiname) then
    $name = MsgBox(262144,"Namenskonflikt!", "Dieser Dateiname existiert bereits!")
    EndIf
    if $name = 1 Then
    $NeuerName = InputBox("Name", "Bitte korrigieren Sie den Namen:", $Dateiname)
    $Dateiname = $Neuername
    EndIf

    Das ist bestimmt eine Kleinigkeit, aber ich sehe zur Zeit den Wald vor läuter Bäumen nicht :(

    Gruß Ralf

  • Pack ein Do Until drum rum:

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,
    teste das mal

    AutoIt
    Do                         ;schleife so lange wiederholen bis der namenskonflikt nicht mehr besteht
        $name = -1             ;vorbelegen
        If $Dateiname = ("I:\AIS_" & $Datum & $Dateiname) Or ("I:\AIS_" & $Dateiname) Then
            $name = MsgBox(262144, "Namenskonflikt!", "Dieser Dateiname existiert bereits!")
        EndIf
        If $name = 1 Then       ;Namenskonflikt
            $NeuerName = InputBox("Name", "Bitte korrigieren Sie den Namen:", $Dateiname)
            $Dateiname = $NeuerName
        EndIf
    Until $name = 1             ;solange ein Namenskonflikt besteht

    //EDIT
    wieder mal nur 2ter...
    @chip, wenn $name mit 1 vorbelegt ist, landest du in einer Endlosschleife

    • Offizieller Beitrag

    Das mit Do ... Until üben wir aber nochmal!!!

    @Spike_2015, prüfen ob eine Datei vorhanden ist geht mit FileExists

  • Hallo zusammen,

    Danke für die vielen Antworten. Werde das morgen testen.

    Ich habe da auch schon rumprobiert, kam aber meistens auf eine Endlosschleife.

    Noch eine ganz andere Frage. Könnte ich stattdessen die GUI mit den bisher getätigten Eingaben nochmals einblenden zur Namenskorrektur. Dafür habe ich aber jetzt keine Code vorliegen.

    Gruß Ralf

    • Offizieller Beitrag

    Wenn der Dateiname in der GUI in einem Inputfeld steht kann auch direkt nach der Eingabe prüfen ob der Dateiname schon existiert.

  • Hallo Bernd,

    uups.


    Zitat

    @Spike_2015, prüfen ob eine Datei vorhanden ist geht mit FileExists


    Hab den Code so schnell runter geschrieben. Das Original ist mit FileExists :love: Peinlich.

    Der Dateiname steht in einem Inputfeld der GUI.

    Gruß Ralf

    • Offizieller Beitrag

    Hier mal ein Beipiel!

  • Guten Morgen,

    ich habe das Ganze jetzt mal ein wenig in mein Skript eingebaut. Klappt wunderbar. In der GUI sind aber auch zur Zeit 4 Checkboxen, von denen eine zwingend auszuwählen ist. Den Wert aus der Auswahl (Kalenderjahr) brauche ich für den weiteren Programmablauf.

    Spoiler anzeigen

    Im Voraus schon mal vielen Dank.

    Gruß Ralf

    Edit:
    Hallo,

    hat sich erledigt, habe es mit einer ComboBox realisiert. ;)

    Gruß Ralf

    Edit:
    Hallo,

    ich muss mich doch nochmals melden.

    ich wollte die Prüfung, ob Sonderzeichen im Dateinamen enthalten sind nun doch im Rahmen der Prüfung des Namenskonfliktes, direkt nach dem Verlassen des Inputfeldes abhandeln.
    Bei meinen bescheidenen Versuchen wird der Wert immer weider als falsch, da mit Sonderzeichen ausgesteuert. ? und & wurden als Beispiel verwendet.

    Wäre dankbar für eure Hilfe

    Spoiler anzeigen

    Gruß Ralf

    • Offizieller Beitrag

    Hallo,

    mit StringReplace funktioniert das so nicht, StringReplace gibt immer einen String zurück egal ob was ersetzt wurde oder nicht. Wenn du StringReplace verwenden willst mußt du danach @extended auswerten, in @extended steht die Anzahl der Ersetzungen, also 0 wenn nichts ersetzt wurde.

    Besser ist aber wenn du es mit StringRegExp auswertest, z. B. so:

    AutoIt
    if StringRegExp($Dateiname, "[\Q\/:*?""<>|\E]") Then
    	$Zeichen = msgbox(262144,"Fehler","Der Dateiname darf keines der folgenden Zeichen enthalten:" & @crlf & @crlf & "\ / : * ? "" < > |" )
    ....

    Das & ist normal kein ungültiges Zeichen für Dateinamen, ausser bei Verwendung in der DOS-Box!