Announcement

Collapse
No announcement yet.

8.3-Konventionen überprüfen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 8.3-Konventionen überprüfen

    Hallo. Bin neu hier und hoffe, das mir hier geholfen werden kann (in anderen Foren kam meist nichtmal eine Antwort :/ ).

    Ich brauche eine Funktion, der ich einen String übergeben kann und die mir zurückgibt, ob dieser String (vollständig, also Laufwerk, Pfad und Dateiname) 8.3-Konform ist.

    Das eigentliche Problem ist, das diese Funktion das auch mit Dateipfaden mit möglichst sehr hoher Präzision erkennen können muss, die noch nicht existieren.

    Denn ich betreibe ein Programm, welches gezwungenermaßen (glaubt mir, wenn ich das so sage) mit einem DOS-Tool interoperieren muss. Und bevor es neue Dateien dafür anlegt oder vorhandene zum bearbeiten öffnet, würde ich gerne prüfen ob der Pfad nun eben 8.3-Konform ist oder nicht.

    Habe nun schon einige Codes dafür gefunden, aber diese Funktionierten nur, wenn die entsprechende Datei auch schon existiert. Ziel ist es aber, es bereits vorher rauszubekommen um gucken zu können ob eine Datei unter einem gewissen Pfad und Dateinamen auch von dem DOS-Tool aufgerufen werden könnte.

    Das Übergeben des Dateinamens an das DOS-Tool in Hochkommas (z.B. dostool.exe "C:\Langer Pfad\Langer Dateiname.end") funktioniert leider auch nicht.

    Meine Ideen gingen soweit, jeden Abschnitt des Pfades einzeln auf bestimmte Merkmale zu überprüfen, die für die 8.3-Konformität wichtig wären, z.B. ob die Länge eines Abschnitts nicht größer ist als 8 Zeichen, ob Leerzeichen vorkommen oder Sonderzeichen etc. Allerdings hab ich keinen Schimmer wie ich das Umsetzen soll :/

    Es würde vorerst reichen, wenn die Funktion die 8.3-Konformität recht gut "erraten" kann, also wirklich nur anhand spezieller Indizien sagt "ja" oder "nein".

    Bitte helft mir *verzweifelt*.

  • #2
    Hallo!

    Der leichte Weg wäre "ExtractShortPathName" sieh mal in die Delphi Hilfe.
    Das klappt nur, wenn es die Datei schon gibt!!!
    Also Mit FileExists prüfen, ob es die Datei schon gibt. Wenn nicht eine kleine Datei anlegen und dann den langen Pfad mit ExtractShortPathName in einen kurzen umwandeln und ide Datei evtl. wieder löschen.

    Wenn Du die Datei nicht anlegen willst/kannst/darfst bleibt nur das Zerlegen des langen Pfades und das einzelne Testen der Komponenten.

    Die Funktion:
    function BreakApart (
    instr : String;
    break : String;
    var ar : tstringlist ): integer;

    var
    p, Start : pchar;
    Count : integer;
    help : String;
    begin

    p := pchar ( instr );
    count := 0;

    ar.clear;
    while p^ <> #0 do begin
    if pos ( p^, break ) <> 0 then begin
    inc ( p );
    end
    else begin
    Start := p;
    while (P^ <> #0) and (pos ( p^, break ) = 0) do begin
    inc ( p );
    end;
    SetString ( help, Start, p-start );
    ar.add ( help );
    Count := Count + 1;
    end;
    end;
    breakapart := count;
    end;

    zerlegt einen String (instr) anhand der Trennzeichen (break) in die einzelenne Worte und gibt diese in der Stringlist (ar) zurück. Achtung ar muss übergeben werden!!!

    Also liefert Breakapart ( MyPath, '\', MyList );
    im ersten Element das Laufwerk im letzten Element die Datei und dazwischen die Einzelteile des Pfades.

    Breakapart ( MyFile, '.', MyList );
    Liefert die aus dem Dateinamen die einzelnen Bestandteile des Dateinamens wenn MyList.count jetzt > 2 ist hat der Dateiname mehrere '.'
    Ansonsten steht ium ersten Element der Liste der Dateiname und im zweiten die Extension. Wieder beides testen und fertig...

    BYE BERND

    Comment


    • #3
      Danke, sehr nützliches Funktiönchen

      Comment


      • #4
        Okay, hier erstmal das was mir bisher schon seeehr gut gefällt:

        Code:
        function Check83(str: String): boolean;
        var
         i: integer;
         Check: TStringList;
        begin
         Check := TStringList.Create;
         result := true;
         BreakApart(str,'.',Check);
         if check.Count < 3 then
         begin
           BreakApart(Check.Strings[0],'\',Check);
           for I := 0 to Check.Count-1 do
           begin
             if length(Check[i]) > 8 then result := false;
             if pos(' ',check[i]) > 0 then result := false;
             // evtl. weitere checks
           end;
         end
         else
         begin
           result := false;
           (* oder evtl. nen weiteren check durchführen, ist
              aber erstmal nicht nötig                        *)
         end;
         Check.Free;
        end;
        Die Funktion gibt TRUE zurück falls der Pfad 8.3-Konform ist, oder eben FALSE, wenn nicht.

        ---
        Wenn dir vlt. noch weitere Testkriterien einfallen, wäre es natürlich prima wenn du die noch nennen könntest. Aber ich bin dir erstmal soooooo dankbar, das du mir auf den richtigen Pfad geholfen hast - denn die Funktion klappt schon ganz prima mit den am meisten auftretenden problemen bzgl. 8.3-Konformität.
        Zuletzt editiert von AndrewP; 10.03.2007, 13:21.

        Comment

        Working...
        X