AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktion funktioniert manchmal, manchmal nicht.
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion funktioniert manchmal, manchmal nicht.

Ein Thema von Alallart · begonnen am 2. Jan 2019 · letzter Beitrag vom 3. Jan 2019
Antwort Antwort
Seite 1 von 2  1 2      
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#1

Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 01:58
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:
    if SizeInfo.Checked then
      if GetFileSize(FilePath) >= (2 * GigaByte) then
        if Length(InfoText) > 0 then
          InfoText := InfoText + ', ' + FileSizeStr(FilePath)
        else
          InfoText := FileSizeStr(FilePath);
Die FileSizeStr-Funktion macht nichts besonderes. Sie gibt den Wert aus GetFileSize nur als String in GB an.

Delphi-Quellcode:
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;
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 03:32
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 07:17

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.
Das halte ich für ein Gerücht. Läßt man Deine Funktion auf ein existierendes Verzeichnis los, wird 0 zurück gegeben, bei einem nicht existierenden Verzeichnis -1.
Vielleicht solltest Du dein Programm einmal mit Hilfe des Debuggers untersuchen.
Was Dalais Lösung in keinster weise obsolet macht!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 10:04
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.
Heiko

Geändert von hoika ( 2. Jan 2019 um 10:08 Uhr)
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#5

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 17:48
Hallo Dalai, hallo p80286,

GetFileSize ermittelt - wie der Funktionsname schon sagt - die Größe einer Datei. Was du aber willst, ist die Größe eines Verzeichnisses
Jajn. Ihr habt zwar Recht, aber das Problem ist es nicht. Ich habe hier den Code auf das Nötigste zusammen reduziert, und nun sieht es so aus, als ob ich mit der Funktion die Größe des Verzeichnisses ermitteln wollte. Will ich nicht. Es wird vielmehr immer die Größe einer Datei gesucht. Letztendlich ist es so, dass im Ordner paar kleine Dateien liegen (zusammen bis 1MB), und eine einzelne große Archiv-Datei (1/2 bis selten bis 5GB). Ich untersuche nur die Größe der einen großen Archivdatei, weil die relevant ist. Ich hab vergessen es zu erwähnen.

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 von hoika:
Was ist z.B., wenn if SizeInfo.Checked=False ist?
Welchen Wert hat dann InfoText?
Es ist so, in meinem Job entwickele ich Projekte, und wenn die durch sind, werden sie archiviert. Damit das Ganze eine Struktur hat und leicht wiedergefunden werden kann, habe ich das Programm entwickelt. Das packt das Projekt und speichert noch paar zusätzliche Informationen im Ordner, damit man sie nicht immer zum nach gucken wieder auspacken muss.

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 SizeInfo.Checked=False , wird auch keine Größe angegeben. Sie ist aber immer an.

Und nein, es werden keine Warnungen ausgegeben, weder später als Error, noch in der IDE.

Geändert von Alallart ( 2. Jan 2019 um 17:55 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#6

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 17:57
Was ist, wenn die Länge von "Infotext" = 0 ist?
Woher kommt der Infotext?

 if Length(InfoText) > 0 then
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#7

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 19:13
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?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#8

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 19:46
Was mich nur wundert ist, warum es gelegentlich doch geklappt hat?
Wie so oft ist es nur eine Kleinigkeit, und liegt im Detail -> Ohne Code können wir dazu gar nichts sagen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 19:48
Zitat:
Was mich nur wundert ist, warum es gelegentlich doch geklappt hat?
Win10?
Dann liegt es wohl daran habe selbst ähnliche Phänomene im Moment.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Funktion funktioniert manchmal, manchmal nicht.

  Alt 2. Jan 2019, 19:51
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz