Geri Dönüşüm Kutusu ( Recycle Bin )'nda kaç adet dosya
olduğunu öğrenmek için aşağıdaki kodu kullanabilirsiniz.
{
Öncelikle shell32.dll içinden çağıracağımız fonksiyonda
kullanacağımız tip tanımlamalarını yapmamız gerekli.
}
type
ULarge_Integer=record
{Bu tipi tanımlamamızdaki neden, Pascal'da 64-bitlik işaretsiz
bir tamsayı değişkeni olmaması. TSHQUERYRBINFO tipinde,
değerleri yazdırtacağımız i64Size ve i64NumItems değişkenleri
64-bitlik işaretsizbir tamsayı değişkenine ihtiyaç duymakta.
Biz ise -tabiri yerinde ise- shell32.dll'i aldatacağız.}
LowPart: Cardinal;
HighPart: Cardinal;
end;
type
TSHQUERYRBINFO = record
{Shell32.dll'den çağıracak olduğumuz fonksiyonun verilerinin
aktarılacağı kayıt değişkeni için gerekli}
cbSize: DWord;
i64Size: ULarge_Integer; // Toplam dosya boyutu yazılacak
i64NumItems: ULarge_Integer; // Toplam dosya sayısı yazılacak
end;
function SHQueryRecycleBin(pszRootPath: PAnsiChar;
var pSHQueryRBInfo: TSHQUERYRBINFO): HRESULT; stdcall;
{Delphi için fonksiyonu tanımladık}
{Şimdi de implementation kısmına geçiyoruz.}
implementation
...
...
function SHQueryRecycleBin; external 'SHELL32.DLL'
name 'SHQueryRecycleBinA';
{Delphi'ye fonksiyonumuzu nereden ve hangi isimle çağıracağımızı
da söyledik.}
{Buraya kadar herşeyi hallettik. Şimdi de kendi fonksiyonumuzu
yazabiliriz.}
function FileCountInRecycleBin: string;
var
SHQUERYRBINFO: TSHQUERYRBINFO;
hr: HRESULT;
begin
//Written by Mert DOĞAN ( mertdogan@hotmail.com ).
//You can freely use this code but remove these lines.
shqueryrbinfo.cbSize:=sizeof(TShQueryRBInfo);
HR:=ShQueryRecycleBin(PAnsiChar(''), shqueryrbinfo);
{Buradaki PAnsiChar('') tip değiştirmesi çok önemli.
İnternette saatlerce yaptığım incelemelerde tüm kodlar
fos çıktı ve çalışmadı. Benim de aklıma böyle bir değişiklik
yapmak geldi ve çalıştığını gördüm.
Bir de birşeyi daha söylemeden edemeyeceğim. pszRootPath
değişkenine verdiğimiz değer olan PAnsiChar('') değeri çelişkili.
Okuduğum hemen hemen tüm kaynaklarda bu, 'C:\' olarak geçiyor.
Hiçbirisi '' olarak değer uygun görmemiş(Tabi bunlarda PAnsiChar
tip değiştirmesi de yoktu).
Ancak SHEmptyRecycleBinA'da da aynı durum söz konusu ama
kaynaklar bu defa '' değerini atamayı uygun görmüş ve bu
konuda bir açıklama da yapılmamış.
Aslında olay şu: Buraya atayacağımız değer hangi sürücüdeki
recycled klasörünü okuyacaksak o sürücünün kök dizini olmalı.
Ama ben yine de burayı boş bıraktım hani belki
tüm sürücülerdekini okur diye ama siz yine de uygulamalarınızda
buraya dikkat edin.}
if Succeeded(hr) then
Result:=inttostr(shqueryrbinfo.i64NumItems.LowPart
+shqueryrbinfo.i64NumItems.HighPart)
else
Result:='Okunamadı';
end;
{Son olarak shqueryrbinfo kaydının i64Size değişkeni ile
toplam dosya boyutunu da öğrenebileceğinizi söylemek istiyorum
ancak her dosya için 32768 byte'lık boyut veriyor olması soru
işaretini çözdükten sonra tabii ki.
Sağlıcakla kalın...}
Mert DOĞAN ( mertdogan@hotmail.com )