Problem mit Form Editor / "Delphi" Script (TMS Scripter) beim Auslesen von Dateigrößen
Verfasst: Fr Jan 24, 2020 8:11 pm
Hallo Aagonauten,
ich bereite derweil ein CC für unsere Mitarbeiter vor, das u.A. die Größe von Ordnern benötigt. Hierfür wollte ich das eingebauten Attribute 'size' von TSearchRec nutzen; Zwar läuft der Code, die Ergebnisse sind aber vollkommen abwegig (u.A. negative Werte).
Folgender Code wird im Command zur rekursiven Berechnung einer Ordnergröße verwendet ("size" ist ein globaler Integer, CC hängt an):
EDIT: Sorry für die Formatierung, aber das Forum scheint meine Zeilenumbrüche in den Code-Tags zu entfernen, als normaler Text gehen wenigstens "nur" Einrückungen verloren.
procedure calcFolderSize(dir: String);
var search: TSearchRec;
begin
search := nil;
if FindFirst(dir + '*.*', [faDirectory, faHidden, faArchive, faAnyFile, faVolumeID, faSysFile, faReadOnly], search) = 0 then
repeat
if (((search.Attr and faDirectory) = faDirectory) and (search.Name <> '.') and (search.Name <> '..')) then
begin
showmessage('Found folder ' + dir + search.Name);
calcFolderSize(dir + search.Name + '\');
end
else
begin
if (((search.Attr and faDirectory) <> faDirectory) and (search.Name <> '.') and (search.Name <> '..')) then
begin
showmessage('Found file ' + dir + search.Name + ' Size: ' + IntToStr(search.Size));
size := size + search.Size;
end;
end;
until FindNext(search) <> 0;
FindClose(search);
end;
procedure Button1Click(Sender: TObject);
begin
calcFolderSize('C:\Temp\');
end;
Da ich den Fehler leider nicht ausfindig machen konnte, habe ich versucht, mittels der in "AagonFiles" implementierten Methode "GetFileInfo" (Signatur: procedure GetFileInfo(FileName: string; FailIfNoInfo: Boolean; VariableName: string);) umzusetzen, wofür folgender Code verwendet wurde:
procedure Button1Click(Sender: TObject);
var fname, test: String;
begin
fname := '<MeinDateiPfad>';
test := '';
GetFileInfo(fname,True,test);
showmessage(test);
end;
Dieser läuft aber leider in einen Laufzeitfehler:
---------------------------
Runtime error
---------------------------
File library FormUnit: GetFileVersionError when evaluating instruction CallProc ($33,$3,$13E493E8,$22684490,'GetFileInfo').
Stack content is: [Integer:439432832,Null,UnicodeString:C:].
Source position: 230,31
---------------------------
OK
---------------------------
Könnt ihr mir bitte helfen, meine Fehler zu finden, um im Form Editor Ordnergrößen berechnen zu können? Aus Laufzeitgründen wäre der erste Ansatz deutlich wichtiger.
ich bereite derweil ein CC für unsere Mitarbeiter vor, das u.A. die Größe von Ordnern benötigt. Hierfür wollte ich das eingebauten Attribute 'size' von TSearchRec nutzen; Zwar läuft der Code, die Ergebnisse sind aber vollkommen abwegig (u.A. negative Werte).
Folgender Code wird im Command zur rekursiven Berechnung einer Ordnergröße verwendet ("size" ist ein globaler Integer, CC hängt an):
EDIT: Sorry für die Formatierung, aber das Forum scheint meine Zeilenumbrüche in den Code-Tags zu entfernen, als normaler Text gehen wenigstens "nur" Einrückungen verloren.
procedure calcFolderSize(dir: String);
var search: TSearchRec;
begin
search := nil;
if FindFirst(dir + '*.*', [faDirectory, faHidden, faArchive, faAnyFile, faVolumeID, faSysFile, faReadOnly], search) = 0 then
repeat
if (((search.Attr and faDirectory) = faDirectory) and (search.Name <> '.') and (search.Name <> '..')) then
begin
showmessage('Found folder ' + dir + search.Name);
calcFolderSize(dir + search.Name + '\');
end
else
begin
if (((search.Attr and faDirectory) <> faDirectory) and (search.Name <> '.') and (search.Name <> '..')) then
begin
showmessage('Found file ' + dir + search.Name + ' Size: ' + IntToStr(search.Size));
size := size + search.Size;
end;
end;
until FindNext(search) <> 0;
FindClose(search);
end;
procedure Button1Click(Sender: TObject);
begin
calcFolderSize('C:\Temp\');
end;
Da ich den Fehler leider nicht ausfindig machen konnte, habe ich versucht, mittels der in "AagonFiles" implementierten Methode "GetFileInfo" (Signatur: procedure GetFileInfo(FileName: string; FailIfNoInfo: Boolean; VariableName: string);) umzusetzen, wofür folgender Code verwendet wurde:
procedure Button1Click(Sender: TObject);
var fname, test: String;
begin
fname := '<MeinDateiPfad>';
test := '';
GetFileInfo(fname,True,test);
showmessage(test);
end;
Dieser läuft aber leider in einen Laufzeitfehler:
---------------------------
Runtime error
---------------------------
File library FormUnit: GetFileVersionError when evaluating instruction CallProc ($33,$3,$13E493E8,$22684490,'GetFileInfo').
Stack content is: [Integer:439432832,Null,UnicodeString:C:].
Source position: 230,31
---------------------------
OK
---------------------------
Könnt ihr mir bitte helfen, meine Fehler zu finden, um im Form Editor Ordnergrößen berechnen zu können? Aus Laufzeitgründen wäre der erste Ansatz deutlich wichtiger.