FileOpen funktioniert nicht, wegen zu langem Pfad

  • Hallo,

    beim Erstellen von einer Textdatei tritt bei mir ständig ein Fehler auf, jedoch habe ich eine Ahnung, wo der genau herkommt.
    Zunächst hole ich ein paar Daten von einer Internetseite mittels der FF.au3 und dem Befehl _FFXPath("...Pfad...", "textContent", 9).
    Das Ergebniss lege ich dann in einer Variable ab.

    Diese Variable verwende ich dann, um einen Pfad zu generieren. Das Ergebnis des Pfades lege ich dann in der Variable $sSpeicherpfad ab.
    Um den einen gültigen Pfad zu erhalten habe ich eine separate Funktion geschrieben, welche den Pfad nun anpasst:

    Spoiler anzeigen
    [autoit]

    Func _FileGetValidName($sString, $sPatern='[*?\\/|:<>"]', $sReplace='_')
    Local $g
    If StringStripWS($sString, 8) = '' Then Return $sString

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

    ; alle Zeichen löschen, welche nicht darstellbar sind --> ASCI 0-31 & 127
    For $g = 0 to 31
    $sString = StringReplace($sString, Chr($g), "~")
    Next
    $sString = StringReplace($sString, Chr(127), "~")

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

    $sString = StringRegExpReplace($sString, $sPatern, $sReplace)
    Return SetExtended(@extended, StringRegExpReplace($sString, '(' & $sReplace & '+)', $sReplace))
    EndFunc

    [/autoit]

    Mit dem Pfad erstelle ich dann erstmal ein neues Verzeichnis mit DirCreate($sSpeicherpfad) .
    Im Anschluss möchte ich eine Textdatei in dem Ordner erstellen. Der Code für diese beiden Operationen sieht wie folgt aus:

    Spoiler anzeigen
    [autoit]

    ; Ordner erstellen
    If DirCreate($sSpeicherpfad) = 0 Then
    MsgBox(64, "Fehler", "Das Erstellen des Verzeichnisses war nicht möglich." & @CRLF & $sSpeicherpfad)
    Exit
    EndIf

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

    ; Titelinformation in separater textdatei speichern
    $fileHandle = FileOpen($sSpeicherpfad & "\titelinformationen.txt", 1+8)
    If $fileHandle = -1 Then
    MsgBox(0, "Fehler", "Die Datei 'titelinformationen.txt' konnte nicht geöffnet werden.")
    Exit
    Else
    FileWriteLine($fileHandle, $arrBookDetails[0])
    FileWriteLine($fileHandle, $arrBookDetails[1])
    FileWriteLine($fileHandle, $arrBookDetails[2])
    FileClose($fileHandle)
    EndIf

    [/autoit]

    Der Fehler tritt erst bei der Funktion FileOpen auf. Zum Probieren habe ich auch mal den Inhalt der Pfadvariable mit dem Explorer gestartet, also Run("Explorer.exe " & $sSpeicherpfad). Jedoch konnte er das Verzeichnis nicht öffnen. Wenn ich jedoch den Pfad mit ClipPut in die Zwischenablage lege und anschließend über die Adressleiste des Explorers dort hin navigieren will, dann klappt es.

    Hier ist das Ergebnis des Pfades aus der Zwischenablage:

    Zitat

    D:\Dokumente\scripting\catch ebooks\Downloads\ebooks\ADIGMA - A European Initiative on the Development of Adaptive Higher-Order Variational Methods for Aerospace Applications (2010); Norbert Kroll, Heribert Bieler, Herman Deconinck und weitere

    Da er ja das Verzeichnis erstellt habe, habe ich den Ordner geöffnet und über die Adressleiste den Pfad opiert. Dieser sieht so aus:

    Zitat

    D:\Dokumente\scripting\catch ebooks\Downloads\ebooks\ADIGMA - A European Initiative on the Development of Adaptive Higher-Order Variational Methods for Aerospace Applications (2010); Norbert Kroll, Heribert Bieler, Herman Deconinck und weitere

    Seltsamerweise, ist das beim vergleichen im notepad++ der gleiche String.
    Ich nehme an, dass der String, welcher von _FFXPath() gelieft wurde, einen falschen Zeichensatz besitzt. Leider kenne ich mich mit Zeichensätzen nicht so gut aus. Im Quellcode der Webseite habe ich gesehen, dass die Seite mit utf8 codiert ist. Siehe Codeausschnitt:

    Code
    <meta charset="UTF-8"/>


    Jedoch habe ich keine Ahnung, wie ich den Pfad richtig konvertieren soll.
    Habt ihr eine Ahnung, wo die genaue Ursache des Fehler liegt und wie ich das Problem lösen kann?

    3 Mal editiert, zuletzt von reeky (30. Januar 2013 um 10:21) aus folgendem Grund: Titel geändert, damit andere User das Thema besser finden

  • Es gibt auch darstellbare Zeichen die in Datei- und Ordnernamen nicht vorkommen dürfen. Um diese heraus zu filtern verwende ich diese Routine:

    [autoit]

    Func _SAFEFILENAME($sRAW)
    ;FireFox autotscript.com
    Local $AUGLY = StringSplit('\ / : * ? " < > |', " ")
    For $i = 1 To $AUGLY[0]
    $sRAW = StringReplace($sRAW, $AUGLY[$i], "")
    Next
    Return $sRAW
    EndFunc ;==>_SAFEFILENAME

    [/autoit]

    mfg autoBert

  • Hallo zusammen,

    Es gibt auch darstellbare Zeichen die in Datei- und Ordnernamen nicht vorkommen dürfen.


    Diese habe ich bereits rausgefiltert. Siehe den 1. Spoiler (oben).

    Dein gesamter Pfad besitzt bereits 244 Zeichen. Plus die Zeichen vom Dateinamen bist Du bei 266 Zeichen und das sind zu viele (mehr als 255).
    Du musst also dafür sorgen, dass der Pfad plus Dateiname immer kleiner als 256 Zeichen bleibt.


    Ich habe bereits eine Überprüfung auf die Länge des Ordnernamens drin. Dabei lasse ich nur Ordnernamen zu, welche einen Dateinamen kürzer als 244 Zeichen besitzen. (habe mal getestet unter win7 64bit und die max Länge was er zugelassen hat waren 244 Zeichen)
    Die 255 Zeichen sind doch für den jeweiligen Ordnernamen dachte ich und nicht für die Gesamtlänge des Pfades, oder?

  • Das ist doch aber irrsinnig. Wenn es Windows ermöglicht einen Ordner alleine schon 244 Zeichen zu geben, dann kann doch die Länge des Pfades nicht auf 255 begrenzt sein. Dann könnte ja bei 2 Ordnern schon Schluss sein.
    Ich werde trotzdem mal versuchen, ob es mit kürzeren Dateienamen auch Probleme gibt.

  • Ich bins nochmal.

    Ich habe ein wenige rumprobiert und dabei folgenden Code verwendet:

    [autoit]

    $sSpeicherpfad = "C:\dies wird ein langer pfad werden\jetzt ist er zwar nich nicht so lang, aber in ein paar sekunden wird er gewachsen sein\was sollte man sonst noch darin speicher\ausser den langen namen natürlich\eines tages näherte sich der lange name dem end12"

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

    If DirCreate($sSpeicherpfad) = 0 Then
    MsgBox(64, "Fehler", "Das Erstellen des Verzeichnisses war nicht möglich." & @CRLF & $sSpeicherpfad)
    Exit
    EndIf

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

    ; Titelinformation in separater textdatei speichern
    $fileHandle = FileOpen($sSpeicherpfad & "\12345678910", 1)
    If $fileHandle = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    Else
    FileWriteLine($fileHandle, "Ich bin keine Schreibmaschine")
    FileClose($fileHandle)
    EndIf

    [/autoit]

    Hierbei habe ich mich langsam von einem langen String zu einen immer kürzeren rangetastet. Dabei musste ich feststellen, dass die maximal erlaubte Pfadlänge bei der Funktion DirCreate() gleich 247 entspricht. Die Länge des Dateinamens funktionierte mit einer Länge von bis zu 11 Zeichen (+1 Zeichen -> Backslash). Insgesamt konnte ich bei FileOpen() also eine Pfadlänge inkl. Dateinamen von 259 Zeichen verwenden, ohne dass es zu Problemen bei der Ausführung kam.

    Ich werde meinen Hauptscript mal umschreiben und dann nochmal berichten, ob es daran lag.
    Danke Oscar für deine Hilfe, ich wäre sonst nicht darauf gekommen. :rock:

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    So hat alles geklappt und ich bin super Zufrieden ! :D

    Einmal editiert, zuletzt von reeky (30. Januar 2013 um 10:19)