Suche nach 0 Byte Files in Verzeichnissen

  • Hallo allerseits,

    Ich habe das Problem, dass ich aus Unterverzeichnissen 0 Byte Files auslesen soll und diese in einem Textfile schreiben will. Kann mir jemand dahingehend helfen bzw. hat bereits ein funktionierendes Skript?

    Danke für eure Hilfe

  • Hallo Merlin,
    gemacht hab ich das noch nicht aber FileGetSize() sollte alles könnnen was du benötigst.
    Wenn du Hilfe brauchst sag bescheid... :)

    • Eine Liste (als Array) aller Dateien in diesem Verzeichnis + Unterverzeichnissen erstellen. Gibt hunderte Funktionen hierfür - meist in Zusammenhang mit dem Begriff "rekursiv". Einfach mal die Forensuche bemühen.
    • Dann dieses Array per For-Schleife durchgehen und jede einzelne Datei mit Filegetsize() prüfen und gegebenenfalls darauf reagieren.
  • Danke vorerst für die Infos. Mir ist der rekursive Aufruf bekannt, auch FilGetSize() kenne ich - nur habe ich das Problem, beide gemeinsam anzuwenden, sodass ich von einem Verzeichnis mit mehrere Unterverzeichnissen alle 0 Byte Dateien in ein Textfile bekomme. Sorry - sitze vermutlich derzeit auf der vielzitierten "Leitung" - hätte vielleicht jemand eine Lösung parat?

  • Danke vorerst für die Infos. Mir ist der rekursive Aufruf bekannt, auch FilGetSize() kenne ich - nur habe ich das Problem, beide gemeinsam anzuwenden, sodass ich von einem Verzeichnis mit mehrere Unterverzeichnissen alle 0 Byte Dateien in ein Textfile bekomme. Sorry - sitze vermutlich derzeit auf der vielzitierten "Leitung" - hätte vielleicht jemand eine Lösung parat?

    Eine Liste (als Array) aller Dateien in diesem Verzeichnis + Unterverzeichnissen erstellen. Gibt hunderte Funktionen hierfür - meist in Zusammenhang mit dem Begriff "rekursiv". Einfach mal die Forensuche bemühen.
    Dann dieses Array per For-Schleife durchgehen und jede einzelne Datei mit Filegetsize() prüfen und gegebenenfalls darauf reagieren.

    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.

  • Jetzt kenne ich mich noch weniger aus.

    Habe das Skript von Oscar + bern670, welches mir ein Array mit allen Datein zurückgibt. Soweit so gut - nur weiß ich derzeit beim besten Willen nicht, wo ich die Fileprüfung auf 0 Byte einfügen kann.

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    ; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
    ; einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]
  • ungetestet...

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <file.au3>

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

    $chkpath = OrdnerPfad

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

    $dirlist = _FileListToArray($chkpath,"*")

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

    for $a = 1 to $dirlist[0]
    $flist = _FileListToArray($chkpath,$dirlist[$a] & "*",1)
    if IsArray($flist) Then
    for $b = 1 to $flist[0]
    $gr = FileGetSize($chkpath & "" & $flist[$b])
    ConsoleWrite($gr)

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

    if $gr < 1 Then
    IniWrite($chkpath&"\Kamel.ini","0 Byte",FileGetLongName($chkpath & "" & $flist[$b]),"0")
    EndIf
    Next
    EndIf
    Next

    [/autoit]
  • Habe das Skript von Oscar + bern670, welches mir ein Array mit allen Datein zurückgibt. Soweit so gut - nur weiß ich derzeit beim besten Willen nicht, wo ich die Fileprüfung auf 0 Byte einfügen kann.


    Warum willst du was an dieser Funktion ändern? Benutz sie einfach und arbeite mit dem Ergebnis weiter.


    [autoit]


    $aAllFiles = _RecursiveFileListToArray(...)
    for $i = 1 to ubound($aAllFiles)-1
    if filegetsize($aAllFiles[$i]) = 0 then machwas($aAllFiles[$i])
    next

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

    func machwas($file)
    ; hier z.b. mit filewriteline die Datei in eine txt schreiben
    endfunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $erg = _RecursiveFileListToArray("C:\NVIDIA", "", 1)

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

    _ArrayDelete($erg, 0)

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

    For $element In $erg
    $groese = FileGetSize($element)

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

    If $groese = 0 Then
    MsgBox(0, "", $element)
    EndIf
    Next

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

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    ; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
    ; einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc ;==>_RecursiveFileListToArray

    [/autoit]

    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.

  • Danke vorerst für die rasche Antwort. Das Tool liest zwar wunderbar alle Verzeichnisse ein - tut dann aber definitiv gar nichts. In der Variable $flist steht nichts drinnen. Weder ein Array noch sonst irgend ein Text.

  • Das liegt dann daran das du das Verzeichnis nicht auf deinen Rechner hast x.x Dann veränder doch einfach mal in Zeile 2 den 1. parameter der Funktion. Dann siehst du auch das Ergebnis :/

  • Die Technologie "Windows Management Instrumentation" (WMI) ermöglicht neben den Zugriff auf alle Arten von Systeminformationen, auch den Zugriff auf das Dateisystem. Solltest Du entfernte Computer abfragen müssen, hilft Dir die Möglichkeit mittels WMI auch auf entferne Systeme zugreifen zu können; vorausgesetzt Du hast die notwendigen Rechte (WMI-Remoting)

    Spoiler anzeigen
    [autoit]


    AutoItSetOption('MustDeclareVars', 1)
    _ListNullByteFiles('c:\windows', True)

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

    Func _ListNullByteFiles($FolderPath, $Recurse = False, $Computer = '.')
    Local $WMIService = ObjGet(StringFormat('winmgmts:\\\%s\\root\\cimv2', $Computer))
    Local $FolderList = $WMIService.ExecQuery( _
    StringFormat( _
    'Associators of {Win32_Directory.Name=''%s''} ' & _
    'WHERE AssocClass = Win32_Subdirectory ' & _
    'ResultRole = PartComponent', $FolderPath))

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

    For $Folder In $FolderList
    ConsoleWrite(StringFormat('Verzeichnis: %s\n', $Folder.Name))

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

    ; --- Verzeichnispfad "escapen"
    Local $Parts = StringSplit($Folder.Name, '\')
    Local $Path = ''
    For $i = 2 To UBound($Parts) - 1
    $Path = StringFormat('%s\\\%s', $Path, $Parts[$i])
    Next
    $Path = StringFormat('%s\\\', $Path)
    ; ---

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

    Local $FileList = $WMIService.ExecQuery( _
    StringFormat( _
    'SELECT FileName, FileSize ' & _
    'FROM CIM_DataFile ' & _
    'WHERE Path = ''%s'' AND FileSize = 0', $Path))

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

    For $File In $FileList
    ConsoleWrite(StringFormat('\t%s %s Byte\n', _
    $File.FileName, $File.FileSize))
    Next ; File

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

    If $Recurse Then
    _ListNullByteFiles($Folder.Name)
    EndIf
    Next ; $Folder
    EndFunc ;==>_ListNullByteFile

    [/autoit]
    • Offizieller Beitrag

    Ich hab mal meine Rekursive Dateifunktion zusammengeschrumpft auf diesen Fall:

    [autoit]

    ConsoleWrite(_GetEmptyFiles_Rekursiv('C:\Test') & @CRLF) ; == statt ConsoleWrite mit FileWrite in Datei schreiben

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

    ;==================================================================================================
    ; Function Name: _GetEmptyFiles_Rekursiv($sPath)
    ; Description: Rekursive Auflistung von 0-Byte Dateien
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; Return Value(s): String (CRLF-getrennt) mit den gefundenen Pfaden der 0-Byte Dateien
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetEmptyFiles_Rekursiv($sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $strFiles = ''
    _ShowSubFolders($oFSO, $strFiles, $sPath)
    Return StringTrimRight($strFiles, 2)
    EndFunc

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

    Func _ShowSubFolders(ByRef $_oFSO, ByRef $_sFiles, $_sFolder)
    Local $Folder = $_oFSO.GetFolder($_sFolder)
    For $file In $Folder.Files
    If $file.Size = 0 Then $_sFiles &= $file.Path & @CRLF
    Next
    For $Subfolder In $Folder.SubFolders
    _ShowSubFolders($_oFSO, $_sFiles, $Subfolder)
    Next
    EndFunc

    [/autoit]