Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Temporary Internet Files: Größe u. Anzahl Files herausfinden (https://www.delphipraxis.net/74999-temporary-internet-files-groesse-u-anzahl-files-herausfinden.html)

Go2EITS 12. Aug 2006 10:07


Temporary Internet Files: Größe u. Anzahl Files herausfinden
 
Hallo DP!

Tja, ne harte Nuss habe ich hier.
Ich bin gerade an der Revision meines Programmes, dass die temporären Verzeichnisse z. B. WinTemp, Usetemp etc. löschen soll. das Klappt prima. Aber Luckie will die Dateien vor dem Löschen sehen. :-D Und ich auch.

Das Problem:
Das Verzeichnis
C:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Temporary Internet Files
lässt sich im Explorer prima anzeigen. Aber alle "Countfiles" und das Holen der Größe des Verzeichnisses in MB schlugen fehl. Ich habe die Sourcen aus der DP bemüht. Klappt bei allen Verzeichnissen, nur nicht bei diesem, speziellen Systemordner.


TUNEUP kann die Files übrigens auch nicht holen und im Detail anzeigen.
Aber da fällt mir was ein, wie es wohl TUNEUP macht, da die Anzahl der Files und die Verzeichnisgröße zu sehen ist: Größe und die Anzahl der Files der gesamten Platte minus aller Files selbst gezählten Files auf der Platte müßte die Anzahl der Files und Größe des IETempVerzeichnisses ergeben.

Etwas umständlich, wenn es überhaupt geht..Vielleicht hat ja jemand einen funktionierenden Code?
Löschen kann ich das Verzeichnis mit einem Torrycode.

Beste Grüße
Go2EITS

marabu 12. Aug 2006 15:24

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Hallo Go2EITS,

mit diesem Code und einem Blick in die API Dokumentation solltest du ein Stück weiter kommen:

Delphi-Quellcode:
uses
  WinInet;

function CacheSize(s: TStrings): Int64;
const
  MAXINFOSIZE = 4 shl 10;
var
  hCache: THandle;
  dwSize: Cardinal;
  i64: Int64;
  pInfo: PInternetCacheEntryInfo;
begin
  Result := 0;
  GetMem(pInfo, MAXINFOSIZE);
  pInfo.dwStructSize := MAXINFOSIZE;
  dwSize := MAXINFOSIZE;
  hCache := FindFirstUrlCacheEntry(nil, pInfo^, dwSize);
  if hCache <> 0 then
  begin
    s.Clear;
    repeat
      s.Add(StrPas(pInfo.lpszSourceUrlName));
      Int64Rec(i64).Hi := pInfo.dwSizeHigh;
      Int64Rec(i64).Lo := pInfo.dwSizeLow;
      Result := Result + i64;
      dwSize := MAXINFOSIZE;
    until not FindNextUrlCacheEntry(hCache, pInfo^, dwSize);
    FindCloseUrlCache(hCache);
  end;
  FreeMem(pInfo, MAXINFOSIZE);
  if hCache = 0 then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Ich habe die byte size berechnet, bei nicht komprimierten Ordnern interessiert vielleicht eher die cluster size.

Grüße vom marabu

1. Hatte FreeMem() vergessen ...
2. Jeder Entry kann eine andere Size haben ...

Go2EITS 12. Aug 2006 15:51

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Hallo marabu,

vielen Dank für Deine Antwort. :thumb:
Ich habe sofort den Code eingefügt und mir die Anzahl zeigen lassen: 505 Files. Der Explorer sagt mir aber 1.228 Files. Magst Du Deine Anzahl der Files unter dem Verzeichnis
C:\Dokumente und Einstellungen\Administrator\Lokale Einstellungen\Temporary Internet Files
bei Gelegenheit überprüfen? Ich agiere unter Windows2000 als ADMIN.

Was in den TStrings drin ist, will ich mir gerade in einer Listbox ansehen.

Beste Grüße! :hi:
Go2EITS

//Nachtrag: Da scheint es eine Lösung zu geben.
Lösung?
Da komme ich aber mit der Umsetzung leider nicht klar. :(

marabu 12. Aug 2006 16:13

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Sorry,

die Diskrepanz bei der Anzahl resultierte aus meiner Annahme, dass jede info im cache die gleiche size hat - das ist nicht so und ich habe meinen Code entsprechend angepasst.

marabu

Go2EITS 12. Aug 2006 16:29

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Hallo marabu,

Ich habe Deinen Code ergänzt:
Statt einer TList habe ich eine Listbox eingesetzt und einen Counter namens COUNT initalisiert der im Code mit dem Eintrag in die Listbox hochzählt.

Hier der geänderte Code:
Delphi-Quellcode:
function CacheSize(s: TStrings): Int64;
const
  MAXINFOSIZE = 4 shl 10;
var
  hCache: THandle;
  dwSize: Cardinal;
  i64: Int64;
  pInfo: PInternetCacheEntryInfo;
begin
  Result := 0;
   //COUNTER
  count:=0;
  // 
  GetMem(pInfo, MAXINFOSIZE);
  pInfo.dwStructSize := MAXINFOSIZE;
  dwSize := MAXINFOSIZE;
  hCache := FindFirstUrlCacheEntry(nil, pInfo^, dwSize);
  if hCache <> 0 then
  begin
    //s.Clear; Meine Listbox
    form1.Listbox2.clear;
    //
    repeat
      //s.Add(StrPas(pInfo.lpszSourceUrlName));
      // Meine Listbox und COUNTER
      form1.Listbox2.Items.Add(StrPas(pInfo.lpszSourceUrlName));
      inc(count);
      //
      Int64Rec(i64).Hi := pInfo.dwSizeHigh;
      Int64Rec(i64).Lo := pInfo.dwSizeLow;
      Result := Result + i64;
      dwSize := MAXINFOSIZE;
    until not FindNextUrlCacheEntry(hCache, pInfo^, dwSize);
    FindCloseUrlCache(hCache);
  end;
  FreeMem(pInfo, MAXINFOSIZE);
  if hCache = 0 then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Mein Counter zeigt 1425 Einträge an, der Explorer 1362.
Deine Routine zeigt 8.206.222 Files an.

Wenn wir es nicht hinbekommen sollten, auch nicht so schlimm. Der Cache ist ein besonderer Bereich im Betriebssystem, der schon sehr fundierte Kenntnisse voraussetzt. Ich zeige zur Not meine Annäherung von 1.425 Einträgen an.

marabu 12. Aug 2006 16:36

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Dass die Zahl jetzt zu hoch ist liegt daran, dass du im Explorer nicht alle Einträge siehst. Vermutlich musst du den einen oder anderen CacheEntryType auslassen, damit die Zahlen übereinstimmen.

marabu

Go2EITS 12. Aug 2006 16:51

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Es sind immerhin 102 MB Daten im Cache. Ob es 8 MIO Eintäge sind? Ich glaube nicht ganz,
da ich meine, dass bei Zugriff auf Verzeichnissen mit über 40.000 Einträgen Windows sehr langsam wird...
Zum Nachzählen werde ich wohl bei 8 Mio. Einträgen nicht kommen.
Ich werde über Shellexceute und Explorer das Cache-Verzeichnis anzeigen und zeige nach dem Löschen des an, wieviele Dateien gelöscht wurden und wie groß die Größendifferenz ist. Damit hätte ich dann konkrete Werte auf "LOWLEVEL-Niveau".

Vielen Dank nochmals, dass Du Dich meines schwierigen Themas angenommen hat.
Einen schönen Abend marabu!

Ich habe einen Dirmon gefunden inkl. Source, der mir die Änderungen anzeigt. Da sehe ich mal rein,
ob ich Routinen zweckentfremden kann.

Go2EITS

marabu 12. Aug 2006 17:00

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Deine 8 Mio Einträge sind schon etwas seltsam, bei mir ist das Verhältnis 328 zu 304 - ein durchaus plausibler Unterschied. Wozu hast du die globale Variable "count" eineführt, wenn die ListBox.Count doch die Anzahl liefert?

marabu

Go2EITS 12. Aug 2006 17:12

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Count? ...aus Unwissenheit. :pale:
Die Diskrepanz ist so groß bei Dir und mir, in Prozent gesehen, wohl aus Surfverhalten resultierend, nicht.
// nachtrag: Beim IECACHE löschen (Code von Torry) habe ich den Code geändert. Er zählt die gelöschen Einträge. Ich komme auf 1425. Ich prüfe mal die Daten, wenn ich weniger Files im Cache habe.

Go2EITS :zwinker:

marabu 12. Aug 2006 18:48

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Um die unterschiedlichen CacheEntryTypes zu zählen kannst du diesen leicht modifizierten Code verwenden:

Delphi-Quellcode:
function CacheSizeEx(s, sCount: TStrings): Int64;
const
  MAXINFOSIZE = 4 shl 10;
var
  hCache: THandle;
  dwSize: Cardinal;
  i64: Int64;
  pInfo: PInternetCacheEntryInfo;
  cet: String;
  index: Integer;
begin
  Result := 0;
  GetMem(pInfo, MAXINFOSIZE);
  pInfo.dwStructSize := MAXINFOSIZE;
  dwSize := MAXINFOSIZE;
  hCache := FindFirstUrlCacheEntry(nil, pInfo^, dwSize);
  if hCache <> 0 then
  begin
    s.Clear;
    repeat
      cet := IntToHex(pInfo.CacheEntryType, 8);
      index := sCount.IndexOfName(cet);
      if index < 0
        then sCount.Values[cet] := '1'
        else sCount.ValueFromIndex[index] := IntToStr(Succ(StrToInt(sCount.ValueFromIndex[index])));
      s.Add(StrPas(pInfo.lpszSourceUrlName));
      Int64Rec(i64).Hi := pInfo.dwSizeHigh;
      Int64Rec(i64).Lo := pInfo.dwSizeLow;
      Result := Result + i64;
      dwSize := MAXINFOSIZE;
    until not FindNextUrlCacheEntry(hCache, pInfo^, dwSize);
    FindCloseUrlCache(hCache);
  end;
  FreeMem(pInfo, MAXINFOSIZE);
  if hCache = 0 then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Form1.ListBox2 hat übrigens nichts in der Routine verloren - du übergibst deine Items als Argument an die Funktion:

Delphi-Quellcode:
procedure TForm1.DemoButtonClick(Sender: TObject);
begin
  SizeLabel.Caption := Format('%.n', [1.0 * CacheSize(ListBox2.Items)]);
end;
Viel Spaß noch mit deinem Projekt.

marabu

Go2EITS 12. Aug 2006 19:16

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Hi, marabu.

Ganz herzlichen Dank für Deinen Aufwand!
Sizelabel.caption kenne ich zwar nicht, aber das ändere ich in Label2.caption.
Die ListBox2 war nur ein Behelf fürs Debuggen.

Label2.Caption := Format('%.n', [1.0 * CacheSizeEx(Form1.ListBox2.Items)]);

Beim Aufruf stimmen die Parameter nicht. Die eckigen Klammern sind wohl für die
Formatanweisung notwendig. Sorry, wenn ich Dich nochmals behelligen muss.
Mit dem Parameter scount habe ich auch Probleme.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
Var s:TStrings;
begin
s:=s.Create;
Label2.Caption := Format('%.n', [1.0 * CacheSizeEx(s,s.count]); //Geändert, da fehlt ein Parameter?
s.Free;
end;
Da stecke ich fest...
Ein s.count oder s.items.count gibt es nicht. :pale:

marabu 12. Aug 2006 19:45

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oje ...

Zitat:

Zitat von Go2EITS
Sizelabel.caption kenne ich zwar nicht, aber das ändere ich in Label2.caption.

genau so solltest du es machen.

Zitat:

Zitat von Go2EITS
Beim Aufruf stimmen die Parameter nicht.

Du darfst CacheSize() und CacheSizeEx() nicht verwechseln, die Signaturen unterscheiden sich in der Zahl der Parameter.

Zitat:

Zitat von Go2EITS
Mit dem Parameter scount habe ich auch Probleme.

Ich merke es - schaue dir mal die angehängte Demo genau an.

Freundliche Grüße

marabu

Go2EITS 12. Aug 2006 20:29

Re: Temporary Internet Files: Größe u. Anzahl Files herausfi
 
Vielen Dank für Deine Mühe, marabu. Prima, dass Du das Beispiel beigefügt hast. Ich habe die unterschiedlichen Parameter gesehen, kam aber nicht zurecht. Ich sehe mir das Beispiel später genau an, ich bin schon zu lang am PC. :cyclops:

//Nachtrag:
Dein Beispiel ist prima. Ohne dem hätte ich die Initialisiungen nicht geschaft. Es gibt noch Differenzen, aber das ist egal. Ich/wir werden mit der Annäherung leben müssen.

Ganz großes Dankeschön!

Beste Grüße! :hi:
Go2EITS


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 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