hallo..wie kann ich sämtliche files auf einer partition inkl. verzeichnisstruktur in eine datei ausgeben? danke für eine antwort!
Announcement
Collapse
No announcement yet.
filelisting
Collapse
X
-
hmmm..kann man heute auch noch, nur brauche ich zu jedem file die komplette verzeichnisstruktur. in diesem fall müsste ich einen import konverter schreiben, der mir aus
"verzeichnis von c:\dos\
ansi.sys
command.com
edit.com
...."
"c:\dos\ansi.sys
c:\dos\command.com
c:\dos\edit.com"
bastelt. kann man hier nicht mit FindNext was erreichen? es geht wie gesagt darum, files und directories in einer verarbeitbaren form auszugeben..
Comment
-
Also so würde ich das tun:
// Verzeichnisse suchen ab Startpfad
procedure DirRecu(start :String; Verzeichnis:TStrings);
Var VInfo : TSearchRec;
Verz : String;
begin
Start:=Trim(Start);
if Start[Length(Start)]<>'\' then begin
Start:=Start+'\';
end;
if FindFirst(start+'*.*',faDirectory, VInfo) = 0 then begin
repeat
if VInfo.Attr and faDirectory <> 0 then begin
if (VInfo.Name<>'.') and (VInfo.Name<>'..') then begin
Verz:=Start+VInfo.Name+'\';
Verzeichnis.Add(Verz);
DirRecu(Verz,Verzeichnis);
end;
end; { end if Directory }
until FindNext(VInfo) <> 0;
end;
FindClose(VInfo);
end;
// Dateien aus mittels einer Verzeichnisliste suchen
function FFiles(Maske :String;DirListe :TStrings):TStrings;
Var
FileInfo : TSearchRec;
VCount : LongInt;
begin
Result:=TStringlist.Create; { Result erstellen }
try
for VCount:=0 to DirListe.Count-1 do begin
{ für alle in Dirliste vorhandenen Verz. }
if FindFirst(DirListe.Strings[VCount]+Maske,faArchive, FileInfo) = 0 then begin
repeat
Result.Add(DirListe.Strings[VCount]+FileInfo.Name);
Until FindNext(FileInfo) <> 0;
end;
FindClose(FileInfo);
end;
except
Result.Free;
end;
end;
// eine Fkt um beides zu kombinieren
function FindFilesRecu(FName, Startpfad :String):TStrings;
Var
TempDirList : TStrings;
begin
Result:=TStringlist.Create; { Ergebnisvar erzeugen}
try
TempDirList:=TStringlist.Create; { Directory liste erzeugen }
DirRecu(Startpfad,TempDirList); { Dirlist erzeugen }
Result:=FFiles(FName,TempDirList); { FileList erzeugen }
except
Result.Free;
end;
end;
// Aufruf wäre dann zb:
Memo.Lines.AddStrings(FindFilesRecu('*.exe','C:')) ;
Ich hoffe das hilft dir weiter.
Gruß Andr
Comment
-
Hi,
anscheinend doch nicht ;-)
Ich würde sagen das ist um einiges kürzer: dir c: /B /S > view.txt
Gruß FalWenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.
Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!
Comment
-
Hallo,
ich schaue mir das BSP nochmal an,
mal kucken ob ich da ein fehler drin habe.
zu der Antwort von Falk du kannst einen befehl über ExecuteFile() ausführen.
ist in der Unit "fmxutils.pas" zu finden. Du kannst eine Option setzten ob der ausgeführte
prozess angezeigt werden soll.
Aufruf wäre so:
je nach Betriebsystem mußt du "cmd.exe" bzw "command.com" angeben
ExecuteFile('cmd.exe','/c dir c:\*.exe /s','',1);
Gruß Andr
Comment
-
Hallo,
Sorry war noch etwas bugy.
Die zwei Fkt. habe ich geändert mußt du ersetzten:
procedure DirRecu(start :String; Verzeichnis:TStrings);
Var VInfo : TSearchRec;
Verz : String;
begin
Start:=Trim(Start);
if Start[Length(Start)]<>'\' then begin
Start:=Start+'\';
end;
Verzeichnis.Add(Start);
if FindFirst(start+'*.*',faDirectory, VInfo) = 0 then begin
repeat
if VInfo.Attr and faDirectory <> 0 then begin
if (VInfo.Name<>'.') and (VInfo.Name<>'..') then begin
Verz:=Start+VInfo.Name+'\';
DirRecu(Verz,Verzeichnis);
end;
end; { end if Directory }
until FindNext(VInfo) <> 0;
end;
FindClose(VInfo);
end;
function FFiles(Maske :String;DirListe :TStrings):TStrings;
Var
FileInfo : TSearchRec;
VCount : LongInt;
begin
Result:=TStringlist.Create; { Result erstellen }
try
for VCount:=0 to DirListe.Count-1 do begin
{ für alle in Dirliste vorhandenen Verz. }
if FindFirst(DirListe.Strings[VCount]+Maske,faAnyFile, FileInfo) = 0 then begin
repeat
If (FileInfo.Attr and faVolumeID = 0) and (FileInfo.Attr and faDirectory = 0) then begin
// keine VolID & Keine Verzeichnisse ausgeben
Result.Add(DirListe.Strings[VCount]+FileInfo.Name);
end;
Until FindNext(FileInfo) <> 0;
end;
FindClose(FileInfo);
end;
except
Result.Free;
end;
end;
Das lag zum ersten an den Dateiattributen Readonly usw.
und an der Verzeichnisliste das Startverz. habe ich nicht mit durchsucht.
Zur Kontrolle "dir *.* /a-d /s" im entspr. Startverzeichnis aufrufen.
Gruß Andr
Comment
Comment