Dateien ohne Dateiendung

  • Hallo Leute,

    wie kann ich im Verzeichnis "D:\para\dib\" incl. Unterverzeichnisse nur bei Dateien, die keine Dateiendung haben, die Dateiendung .txt anhängen?

    Viele Grüße,
    Dino

    Einmal editiert, zuletzt von Dino (19. Mai 2012 um 23:50)

  • Mit FileFindFirstFile/FileFindNextFile (Bsp. in der Hilfe ansehen) alle Elemente in dem Ordner durchgehen und mit dem Makro @extended (siehe Hilfe FileFindNextFile) prüfen ob Element eine Datei oder ein Ordner ist.
    Wenn im Dateinamen kein Punkt vorkommt (StringInStr()) dann den Dateinamen entsprechend ändern.

    Edit: Du hattest geschrieben auch Unterverzeichnisse.
    Das habe ich erst überlesen.
    Dann die vielen Funktionen hier aus dem Forum welche meist mit dem Begriff "rekursiv" zusammenhängen verwenden um dir eine komplette Dateiliste zu erzeugen und diese dann einzeln durchgehen und überprüfen.

    Einmal editiert, zuletzt von AspirinJunkie (18. Mai 2012 um 13:25)

    • Offizieller Beitrag

    Festzustellen, ob eine Datei keine Endung hat ist mit AutoIt an sich nichht möglich, da nur der Punkt als Abgrenzung zur Extension keine Sicherheit bietet, schließlich gibt es auch Dateien mit Punkt im Namen.
    Deshalb braucht es hier eine Lösung, die explizit auf die Erweiterung zugreifen kann.

    Spoiler anzeigen
    [autoit]

    $sPfad = "D:\para\dib\"
    _AddExt_txt($sPfad)

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

    Func _AddExt_txt($_sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $oFile, $sExt
    Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)
    For $i = 1 To $aFiles[0]
    $oFile = $oFSO.GetFile($aFiles[$i])
    $sExt = $oFSO.GetExtensionName($oFile)
    If $sExt = '0' Then $oFSO.MoveFile($aFiles[$i], $aFiles[$i] & '.txt')
    Next
    EndFunc

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
  • Hallo BugFix,

    es funktioniert prima :thumbup: DANKE!!!

    Ich möchte die Daten jetzt in einem anderen Programm verarbeiten und anschließend die Dateienendungen .txt entfernen.
    In diese Richtung geht es sicherlich einfacher, oder :?: :rock:

    Viele Grüße,
    Dino

    • Offizieller Beitrag

    Das ist easy, einfach die umbenannten Dateipfade mit zurückgeben lassen.

    Spoiler anzeigen
    [autoit]

    $sPfad = "D:\para\dib\"
    $aRenamedFiles = _AddExt_txt($sPfad)

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

    ; == Bearbeitung

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

    ; == Rückbenennen
    _Rename_Back($aRenamedFiles)

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

    Func _AddExt_txt($_sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $oFile, $sExt
    Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)
    Local $sRet = ''
    For $i = 1 To $aFiles[0]
    $oFile = $oFSO.GetFile($aFiles[$i])
    $sExt = $oFSO.GetExtensionName($oFile)
    If $sExt = '0' Then
    $oFSO.MoveFile($aFiles[$i], $aFiles[$i] & '.txt')
    $sRet &= $aFiles[$i] & '.txt' & Chr(0)
    EndIf
    Next
    Return StringSplit(StringTrimRight($sRet, 1), Chr(0))
    EndFunc

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

    Func _Rename_Back($_aFiles)
    For $i = 1 To $_aFiles[0]
    FileMove($_aFiles[$i], StringTrimRight($_aFiles[$i], 4))
    Next
    EndFunc

    [/autoit]
  • Festzustellen, ob eine Datei keine Endung hat ist mit AutoIt an sich nichht möglich, da nur der Punkt als Abgrenzung zur Extension keine Sicherheit bietet, schließlich gibt es auch Dateien mit Punkt im Namen.
    Deshalb braucht es hier eine Lösung, die explizit auf die Erweiterung zugreifen kann.


    Die Dateiendung ist der Teil des Dateinamens welcher auf den letzten Punkt im Dateinamen folgt.
    Gibt es mindestens einen Punkt im Dateinamen hat die Datei auch eine Endung.
    Existiert kein Punkt hat sie keine Endung.
    Dies zu prüfen ist durchaus mit AutoIt möglich.
    Der "explizite Zugriff" von Scripting.FileSystemObject auf Dateiendungen besteht daher nur darin den Teil hinter dem letzten Punkt abzutrennen.

    Dino
    Um die Dateiendung zu entfernen kannst du mit StringInStr (den 4. Parameter auf -1 setzen) die Position des letzten Punktes suchen und mit dieser Information die Funktion StringLeft() füttern.

    • Offizieller Beitrag

    Gibt es einen Punkt im Dateinamen hat die Datei auch eine Endung.


    OK, wenn dem so ist, lag ich daneben. ;)
    Ich war immer der Meinung, dass Dateinamen ohne Endung aber mit Pukt im Namen möglich sind. Das Windows alles, was nach einem Punkt kommt als Endung interpretiert, heißt ja noch lange nicht, dass dem auch so ist. Oder?

  • Ja das mit der Endung ist halt so ne unscharfe Sache.
    Es gibt ja kein Extrafeld im Dateisystem für die Dateiendung.
    Es ist halt nur eine Konvention das man sagt nur ein Dateinamen ist zu uneindeutig wir müssen Dateinamen bisschen spezieller machen.
    Da hat man halt gesagt: Ok ein Dateitypkennzeichnung wär schön - sagen wir halt man soll Dateien so benennen das alles nach dem letzten Punkt kommt den Typ kennzeichnet.
    Kann man - muss man aber nicht.
    Egal also ob man seinen Dateinamen so meint - die Dateiendung wird halt immer so interpretiert.
    Es ist halt nichts handfestes sondern lediglich ein möglicher Teil des Dateinamens.

  • Diese Meldung bekomme ich:

    [autoit]

    D:\- AUTOIT -\Dateien ohne Endung\txt entfernen.au3(12,60) : ERROR: _GetFilesFolder_Rekursiv(): undefined function.

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

    Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)

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

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

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

    D:\- AUTOIT -\Dateien ohne Endung\txt entfernen.au3 - 1 error(s), 0 warning(s)

    [/autoit]
  • so?

    Spoiler anzeigen

    $sPfad = "D:\db\"
    $aRenamedFiles = _AddExt_txt($sPfad)

    ; == Bearbeitung

    ; == Rückbenennen
    _Rename_Back($aRenamedFiles)

    Func _AddExt_txt($_sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $oFile, $sExt
    Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)
    Local $sRet = ''
    For $i = 1 To $aFiles[0]
    $oFile = $oFSO.GetFile($aFiles[$i])
    $sExt = $oFSO.GetExtensionName($oFile)
    If $sExt = '0' Then
    $oFSO.MoveFile($aFiles[$i], $aFiles[$i] & '.txt')
    $sRet &= $aFiles[$i] & '.txt' & Chr(0)
    EndIf
    Next
    Return StringSplit(StringTrimRight($sRet, 1), Chr(0))
    EndFunc

    Func _Rename_Back($_aFiles)
    For $i = 1 To $_aFiles[0]
    FileMove($_aFiles[$i], StringTrimRight($_aFiles[$i], 4))
    Next
    EndFunc

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix (bugfix@autoit.de)
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc