Değişken Dosya Boyutunu Öğrenmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kafkasyali
Üye
Mesajlar: 75
Kayıt: 04 Nis 2008 01:03

Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen kafkasyali »

Değişken dosya boyutunu almak için ne denediysem olmadı. İnternette yaptığım araştırmalarda iki kalıp buldum.

Her iki kodu da timer içinde kullanıyorum.

Kod: Tümünü seç

1-)

procedure TForm1.Button1Click(Sender: TObject);
var
  srFileSR: TSearchRec;
  sFileName, sFileSize: string;
begin
  sFileName := 'c:\test\2.avi';
  FindFirst(sFileName,faAnyFile,srFileSR);
  sFileSize := IntToStr(srFileSR.Size);
  Showmessage(sFileSize);
end;
Yukarıdaki kodlarla yapmaya çalıştığımda I/O hatası alıyorum.

Kod: Tümünü seç

2-) 

function GetFileSize(const filename: string): Int64;  
 var  
   f: TWin32FindData;  
   h: THandle;  
 begin  
   result := -1;  
   try  
     if not FileExists(filename) then  
       exit;  
     h := FindFirstFile(PChar(filename), f);  
     if h = INVALID_HANDLE_VALUE then  
       RaiseLastWin32Error;  
     try  
       Result := f.nFileSizeHigh shl 32 + f.nFileSizeLow;  
     finally  
       windows.FindClose(h);  
     end;  
   except  
   end;  
 end;
Bununla yaptığımda timer olmadan boyutu alabiliyorum fakat timer kullandığımda boyutu sıfır olarak gösteriyor. Bu konuda yardımcı olabilir misiniz?
visualbasic.stupid:=true;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen sabanakman »

Dosyaya bilgi yazılırken bu türden bir bilgiyi sağlıklı olarak elde edemezsiniz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
kafkasyali
Üye
Mesajlar: 75
Kayıt: 04 Nis 2008 01:03

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen kafkasyali »

Aslında amacım yüzde hesabı çıkarmak. Yaptığım küçük uygulama bir klasörü sıkıştırıyor. Yani dosyanın boyutunu bayt'ı bayt'ına almak yerine yaklaşık değerler de olabilir.

Klasör boyutunu alıyorum. Sıkıştırılan dosyanın boyutunu yaklaşık ta olsa takip etmek istiyorum. WinRAR progressbar'ı bilirsiniz. Eğer sıkıştırılan dosyanın boyutunu alabilirsem aşağıdaki görüntü oluşacak.

Resim

kullandığım kodlar

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
var
a,b,c:integer;

begin
a:=klasör boyutu kodları
b:=sıkıştırılan dosya boyutu alma kodları
c:=round(b/a*100); //sıkıştırılan dosya klasörün yüzde kaçı? (yuvarlayarak tam sayı al)
sarı_progressbar.position:=c;
end;
visualbasic.stupid:=true;
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen mkysoft »

Abbrevira kompanenti bu tür verileri kendisi veriyordu. Siz kendiniz bir algoritma geliştirdiniz sanırım.
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen orhancc »

SIkıştırmayı ne ile yapıyorsun ?
kafkasyali
Üye
Mesajlar: 75
Kayıt: 04 Nis 2008 01:03

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen kafkasyali »

7zip'in Dll dosyasını kullanıyorum. Abbrevia'ya göre bayağı gelişmiş bir program bilirsiniz.
visualbasic.stupid:=true;
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Değişken Dosya Boyutunu Öğrenmek

Mesaj gönderen sadettinpolat »

7zip.dll callback metodlari destekliyor ama dosya boyutu olarak bilgi donmuyor sanirim.. kurcalamak lazim...

Kod: Tümünü seç

Progress bar

 function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall;
 begin
   if total then
     Mainform.ProgressBar.Max := value else
     Mainform.ProgressBar.Position := value;
   Result := S_OK;
 end;

 procedure TMainForm.ExtractClick(Sender: TObject);
 begin
   with CreateInArchive(CLSID_CFormatZip) do

   begin
     OpenFile('c:\test.zip');
     SetProgressCallback(nil, ProgressCallback);
     ...
   end;
 end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla