Dosya taşırken sıkıştırma problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Dosya taşırken sıkıştırma problemi

Mesaj gönderen carsoft »

Dosyaları taşırken sıkıntı yok fakat sonra 50 kadar dosyayı sıkıştırıyor sonra program çalışmayı durdurdu hatası verip kapanıyor

kullandığım fonsiyon şu şekilde

Kod: Tümünü seç

Function Dosyaal(FileName : String;Dosya: String) : Boolean;
var
Listeler : TStringList;
dosyam : String;
c,zip:Tmemorystream;
NewP : String;
begin
  Listeler := TStringList.Create;
  c:= Tmemorystream.create;
  zip:= Tmemorystream.create;


  Result := MoveFile(PChar(FileName),PChar(Yedekler+dosyam));
  if Result = True then begin
  Listeler.Add(FileName);
  Listeler.Add(FormatDateTime('hh:mm dd.mm.yy',Now));

  end;
Listeler.SaveToFile(Yedekler+'Yedek.ini');
Listeler.Free;
try
  NewP :=  PChar(Yedekler + dosyam);
  c.LoadFromFile(NewP);
  paketle(c,zip);
  finally
c.Free;
zip.Free;
end;
end;
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Dosya taşırken sıkıştırma problemi

Mesaj gönderen carsoft »

sorun çözülmüştür iki yerde free yapmışım ondan kaynaklanıyormuş
ertank
Kıdemli Üye
Mesajlar: 1668
Kayıt: 12 Eyl 2015 12:45

Re: Dosya taşırken sıkıştırma problemi

Mesaj gönderen ertank »

Merhaba,

Biraz düzenlenmiş fonksiyonu aşağıdaki gibi yazabilirsiniz. Bu örnekte dinamik olarak oluşturulan nesnelerin hafıza kaçağı vermemesi için doğru kullanımı gösterilmiştir.

Kod: Tümünü seç

// parametreler değiştirilmeyecek ise "const" olarak tanımlanması çalışma zamanında bir miktar performans artışı sağlayacaktır.
function DosyaAl(const FileName, Dosya: string): Boolean;
var
  Listeler: TStringList;
  Dosyam: string;
  C, Zip: TMemoryStream;
  NewP: String;
begin
  Result := False;

  Listeler := TStringList.Create();
  try // Bu noktadan sonra hata oluşsa dahi "Listeler" mutlaka hafızadan silinecektir.
    C := TMemoryStream.Create();
    try // Bu noktadan sonra hata oluşsa dahi "C" mutlaka hafızadan silinecektir.
      Zip:= TMemoryStream.Create();
      try  // Bu noktadan sonra hata oluşsa dahi "Zip" mutlaka hafızadan silinecektir.
        Result := MoveFile(PChar(FileName), PChar(Yedekler + dosyam));
        // "if Result then" ile "if Result = True then" ifadesi anlam açısından tamamen aynıdır. 
        // İkincisi iki değişken kontrolü içerdiği için bir miktar daha fazla işlemci zamanı harcayacaktır
        if Result then  
        begin
          Listeler.Add(FileName);
          // Formata dikkat edin. hh:mm şeklinde değil hh:nn şeklinde olmalı
          Listeler.Add(FormatDateTime('hh:nn dd.mm.yy', Now));
        end
        else // Bu kontrol yapılmadığı takdirde ileride anlaşılması zor hatalar ile karşılaşabilirsiniz
          Exit();

        Listeler.SaveToFile(Yedekler + 'Yedek.ini');
        // Yedekler değişkeni en azından Form genelinde tanımlanmış bir değişken. Veri türünün ne olduğunu bilmiyoruz.
        // Ancak eğer string tipinde tanımlanmış ise (Listeler.SaveToFile() fonksiyonu string parametre ister)
        // aşağıdaki PChar() dönüşümüne gerek yoktur.
        NewP :=  PChar(Yedekler + dosyam);
        C.LoadFromFile(NewP);
        Paketle(C, Zip); // Bu işlemin başarılı olup olmadığının da kontrolü gereklidir
      finally
        Zip.Free();
      end;
    finally
      C.Free();
    end;
  finally
    Listeler.Free();
  end;

  Result := True;
end;
Cevapla