Hallo,
wie ist es möglich, Dateien und Ordner in einem bestimmten Verzeichnis (immer der Dokumente-Ordner eines jeden PCs - Benutzerunabhängig) zu zählen und in eine Variable zu schreiben, die dann später genutzt wird?
Danke im Voraus
~P1xel
Hallo,
wie ist es möglich, Dateien und Ordner in einem bestimmten Verzeichnis (immer der Dokumente-Ordner eines jeden PCs - Benutzerunabhängig) zu zählen und in eine Variable zu schreiben, die dann später genutzt wird?
Danke im Voraus
~P1xel
Warum so groß aufziehen?
Er will nur die Anzahl an Dateien und Ordner.
Dafür reicht DirGetSize doch vollkommen.
Okay, also ich hab es jetzt so gelöst:
$Anzahl = DirGetSize ("C:\Users\peter\Documents\", 1)
$AnzahlOrdner = $Anzahl[1]
$AnzahlDateien = $Anzahl[2]
$AnzahlBeides = $AnzahlDateien + $AnzahlOrdner
MsgBox(0,"Anzahl",$AnzahlDateien & " Dateien und " & $AnzahlOrdner & " Ordner. Also insgesamt " & $AnzahlBeides & " Elemente.")
Alles anzeigen
Nur irgendwie werden mir da viel zu große Zahlen ausgegeben? Der Dokumente-Ordner hat demnach 857 Dateien und 312 Ordner O.o
Wenn ich einen Ordner im Dokumente Ordner beispielsweise auswähle, dann zeigt er es mir richtig an.
Gibt es so viele versteckte Dateien? Oder geht der Befehl die Unterverzeichnisse auch noch durch (was ich nicht will!)?
Oder geht der Befehl die Unterverzeichnisse auch noch durch
Nochmal die Hilfe (diesmal aufmerksamer) zu DirGetSize lesen - besonders die Erklärung zum Flag-Parameter.
Wenn du das nicht willst:
#include <MsgBoxConstants.au3>
Example("C:\Users\laurien\Documents\")
Func Example($sMyFolder)
Local $hSearch = FileFindFirstFile($sMyFolder & "*.*")
If $hSearch = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern.")
Return False
EndIf
Local $sFileName = "", $iDir, $iFile
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sMyFolder & $sFileName), "D") Then
$iDir += 1
Else
$iFile += 1
EndIf
WEnd
$AnzahlBeides = $iFile + $iDir
MsgBox(0,"Anzahl", $iFile & " Dateien und " & $iDir & " Ordner. Also insgesamt " & $AnzahlBeides & " Elemente.")
FileClose($hSearch)
EndFunc ;==>Example
Alles anzeigen
Angepasst aus der Hilfe-Datei.
Er sucht prinzipiell Dateien in einem Ordner. Das wird einmal Initialisiert "FileFindFirstFile" und dann die Dateien nach und nach ausgegeben "FileFindNextFile" bis er keine Datei mehr findet "@error".
Auch Ordner sind für Windows erst einmal Dateien. Unterscheiden tun die sich eigentlich nur durch ein File-Attribut: Directory. Directory ist das, was in Foren häufig einfach Folder genannt wird. AutoIt liest über die Funktion "FileGetAttrib" die Attribute einer Datei ein. Besitzt es dabei das Attribut "D" (=Directory) ist es ein Ordner. Das Beispiel oben hat genau zwei Variablen: Eine für Ordner eine für Dateien, und prüft: Ist das nach Attributen ein Ordner? Wenn ja, zähle bei Ordnern um eins hoch, ansonsten bei Dateien.
Statt dem StringInStr(FileGetAttrib(...), "D") könnte man auch einfach das @extended-Makro von FileFindNextFile verwenden.
Oder wie gesagt einfach mit DirGetSize (nur halt mit Flag=3!).
Könnte man. Es macht aber kaum einen Unterschied, außer, dass diese Makros - genau wie binäre Flags - für Neulinge deutlich schwieriger verständlich sind.
Du meinst If StringInStr(FileGetAttrib($sMyFolder & $sFileName), "D") Then ist verständlicher als If @extended Then?
@AspirinJunkie Du verwirrst mich Wie würdest du das ganze denn genau machen (kompletter Code)?
Dein Beispiel von oben - nur mit einer 3 statt einer 1 als Flag bei DirGetSize.
Du meinst If StringInStr(FileGetAttrib($sMyFolder & $sFileName), "D") Then ist verständlicher als If @extended Then?
Erfahrungsgemäß: Definitiv. Das eine versteht praktisch jeder, weil es was zu verstehen hat, das andere nicht, weil es immer was anderes bedeuten kann (nämlich bei jeder Funktion), direkt nach der Funktion abgefragt werden muss, und zudem noch nicht mal ersichtlich ist, was es eigentlich tut.
Code von oben mit einer 3 statt 1:
Mit diesen [1] und [2] geht es nicht, da kommt ein Fehler.
Ohne diese kommt am Ende raus: "-1 Dateien und -1 Ordner. Also insgesamt -2 Elemente." - also Fehler -1.
EDIT: Hab nicht alles kopiert, geht doch...
Und das ist deutlich einfacher als die andere Möglichkeit!
also Fehler -1.
Fehler -1 bedeutet (Siehe Hilfe), dass der angegebene Pfad nicht existiert.
Wenn es tatsächlich so sein sollte, dass der Pfad konstant bleibt und nur eine Veränderung des Flags von 1 auf 3 diesen Fehler verursacht müssten wir versuchen ein Beispiel zu finden welches dieses Verhalten bei anderen auch reproduziert.
Denn dann wäre es ein Bugmeldung an die AutoIt-Devs wert.
Da ich es aber selbst nicht reproduzieren kann bitte ich dich die Ausgabe folgenden Skriptes zu posten:
$aDirInfo = DirGetSize (@MyDocumentsDir, 1)
ConsoleWrite(StringFormat("%5d Dateien + %5d Ordner = %5d gesamt\n", $aDirInfo[1], $aDirInfo[2], $aDirInfo[1] + $aDirInfo[2]))
$aDirInfo = DirGetSize (@MyDocumentsDir, 3)
ConsoleWrite(StringFormat("%5d Dateien + %5d Ordner = %5d gesamt\n", $aDirInfo[1], $aDirInfo[2], $aDirInfo[1] + $aDirInfo[2]))
siehe Edit, geht doch, war mein Fehler...