![]() |
Funktion funktioniert manchmal, manchmal nicht.
Ich habe folgendes Problem: mein Programm bearbeitet den Inhalt eines Ordner. Was es genau macht ist unwichtig, auf jeden Fall wird der Ordner als letzte Aktion umbennant. Und wenn der Inhalt des Ordner größer 2 GByte ist, wird an den Ordnernamen noch die Größe des Inhalts in Klammern angehängt, zB "Ordnername (xyz, 2,5GB)".
Das Problem ist, dass das Anhängen der Größe manchmal klappt und manchmal nicht. Der Ordner wird IMMER umbenannt, das ist nicht das Problem. Nur manchmal, obwohl der Inhalt größer 2 GByte ist, wird die Info nicht erzeugt, manchmal schon. Ich sehe nicht woran das liegt. Ich habe schon meine GetFileSize-Funktion gegen eine andere aus dem Internet ersetzt, für den Fall, dass die Funktion das Problem ist. Problem bleibt bestehen.
Delphi-Quellcode:
const
GigaByte: Int64 = 1024 * 1024 * 1024;
Delphi-Quellcode:
Die FileSizeStr-Funktion macht nichts besonderes. Sie gibt den Wert aus GetFileSize nur als String in GB an.
if SizeInfo.Checked then
if GetFileSize(FilePath) >= (2 * GigaByte) then if Length(InfoText) > 0 then InfoText := InfoText + ', ' + FileSizeStr(FilePath) else InfoText := FileSizeStr(FilePath);
Delphi-Quellcode:
Wo es eigentlich immer klappt, das ist in der IDE. Da wird die Größenangabe immer korrekt angegeben. Und gelegentlich über die EXE. Nur nicht immer.
function GetFileSize(const AFileName: string): Int64;
var SearchRec: TSearchRec; OldMode: Cardinal; Size: TULargeInteger; begin Result := -1; OldMode := SetErrorMode(SEM_FAILCRITICALERRORS); try if FindFirst(AFileName, faAnyFile, SearchRec) = 0 then begin Size.LowPart := SearchRec.FindData.nFileSizeLow; Size.HighPart := SearchRec.FindData.nFileSizeHigh; Result := Size.QuadPart; SysUtils.FindClose(SearchRec); end; finally SetErrorMode(OldMode); end; end; |
AW: Funktion funktioniert manchmal, manchmal nicht.
GetFileSize ermittelt - wie der Funktionsname schon sagt - die Größe einer Datei. Was du aber willst, ist die Größe eines Verzeichnisses, die definiert ist als die gesamte Größe aller Dateien in einem Verzeichnis, und zwar rekursiv. Was du also tun musst, ist klar: Durch die gesamte Verzeichnisstruktur iterieren und die Summe aller Dateigrößen bilden. Erst dann hast du die Größe eines Verzeichnisses.
Grüße Dalai |
AW: Funktion funktioniert manchmal, manchmal nicht.
Zitat:
Vielleicht solltest Du dein Programm einmal mit Hilfe des Debuggers untersuchen. Was Dalais Lösung in keinster weise obsolet macht! Gruß K-H |
AW: Funktion funktioniert manchmal, manchmal nicht.
Hallo,
zeig mal mehr Code. Was ist z.B., wenn if SizeInfo.Checked=False ist? Welchen Wert hat dann InfoText? Zeigt der Compiler Warnungen an? So wie Variable nicht initialisiert? Außerdem setzt du mit SetErrorMode(SEM_FAILCRITICALERRORS); ja alle Warnungen, falls irgendwas mit dem Verzeichnis nicht in Ordnung ist außer Kraft. Das würde ich auf jeden Fall mal auskommentieren und dann versuchen, den Fehler nachzustellen. |
AW: Funktion funktioniert manchmal, manchmal nicht.
Hallo Dalai, hallo p80286,
Zitat:
Es bleibt also bei dem Problem. Ich ermittle die Größe der einen Datei, und wenn die größer als 2GB ist, kommt ein Hinweis an den Ordner dran. Was da noch im Ordner drin ist ist so klein, dass es nicht relevant ist. Zitat:
In der Regel gibt es nur den Ordner-Namen. Gelegentlich kommt noch das Format des Projekts als Info in der Klammer rein, wenn es von dem Standardformat abweicht, und die Größe, wenn es größer als 2GB ist. Um deine Frage zu beantworten: wenn
Delphi-Quellcode:
, wird auch keine Größe angegeben. Sie ist aber immer an.
SizeInfo.Checked=False
Und nein, es werden keine Warnungen ausgegeben, weder später als Error, noch in der IDE. |
AW: Funktion funktioniert manchmal, manchmal nicht.
Was ist, wenn die Länge von "Infotext" = 0 ist?
Woher kommt der Infotext?
Delphi-Quellcode:
if Length(InfoText) > 0 then
|
AW: Funktion funktioniert manchmal, manchmal nicht.
Vielen Dank für die Hilfe, ich habe das Problem lokalisiert. Wie so oft ist es nur eine Kleinigkeit, und liegt im Detail.
Nun, das Programm selbst ist schon älter, nur habe ich die Zusatzinfos in der Klammer in den letzten Monaten immer selbst hinzugefügt. Das wollte ich jetzt automatisch erledigen. Dabei habe ich vergessen mir die alte Prozedur nochmal genau anzugucken, und habe am Ende, da wo der Ordner umbenannt wird (vorher hat er einen Temp-Namen) den neuen Code eingefügt. Ich habe übersehen, dass der Archivname (auch er hat vorher einen Temp-Namen) bereits in der Mitte der Prozedur umbenannt wurde. Irgendwie hatte ich im Kopf, dass beides gleichzeitig umbenannt wird, also Archivname und Ordner. Um auf den Punkt zu kommen, da wo ich die Dateigröße ermittelt habe war der Archivname bereits neu umbenannt. Was mich nur wundert ist, warum es gelegentlich doch geklappt hat? |
AW: Funktion funktioniert manchmal, manchmal nicht.
Zitat:
|
AW: Funktion funktioniert manchmal, manchmal nicht.
Zitat:
Dann liegt es wohl daran habe selbst ähnliche Phänomene im Moment. gruss |
AW: Funktion funktioniert manchmal, manchmal nicht.
Wenn Dein Programm genauso umständlich arbeitet, wie Du es erklärst, wundert es mich nicht, daß es Probleme gibt. (Ist nicht bös gemeint)
Also zeig mal den vollständigen Sourcecode. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz