Hafızadaki diziyi dosyaya kaydetme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Hafızadaki diziyi dosyaya kaydetme

Mesaj gönderen uğur alkan »

Hafızada 2milyondan fazla kayıt tutan byte bir dizim var bu diziyi bir text dosyaya nasıl kaydedebilirim.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Hocam sıralı olarak erisebiliyormusun ,
eger oyleyse bastan sona byte byte dosyaya binary yazdırabilirsin.
2 milyon byte 2 mb boyutunda bir dosya demek
ama biraz yavas olabilir.
bunun yerine hafızada tuttugun bilesenin bir streame yazma metodu varsa o sekilde daha hızlı olabilir.
ÜŞENME,ERTELEME,VAZGEÇME
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Bayt olarak kaydetmek için;

Kod: Tümünü seç

var
  dosya:file;
  boyut,Yazilan:integer;
const
  miktar = 10000//bir seferde yazılacak sayı

begin
  AssignFile(dosya,'C:\Kayit');
  Rewrite(dosya,1);
  Boyut:=SizeOf(BaytDizisi);
  yazilan:=0;
  Repeat
    BlockWrite(dosya,baytDizisi,miktar);
    Yazilan:=Yazilan+miktar;
  until yazilan>=Boyut;
  closefile(dosya);
end;
Kolay gelsin...

(Bu text olarak kaydetmiyor. Neden text olarak?)
En son ulu coder tarafından 20 Haz 2006 11:48 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

değişkeni direkt binary yazarsanız hız problemi olmaz ama binary olduğu için başka bir programdan işlemek zor olur. ama sabit aralıklı olacağı için excele import edebilirsiniz. veya en mantıklısı @gkimirti nin dediği gibi diziyi bir geçici tabloda tutun( :ara memtable) hem içinden kayıt çıkarması, hemde kaydetmesi kolay olur.(stream veya csv kaydedebiliyor)

bur örnekte geçici birşeyler saklamak için yapılmıştı. mesaj isminde bir değişken var. onu kaydedip okumakla ilgili.

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
var PCharPtr:PChar;
    size:longint;
    SysFileHandle:Integer;
    FileInfo:TOFSTRUCT;
    ErrCode:LongInt;
    ch : Char;
    pcSysFileName:string;

begin
  for i := 1 to MAX_MESAJ_SAYISI do
    mesaj[i].dolumu:= FALSE;

  pcSysFileName:=ExtractFilePath(Application.ExeName)+'data.dat';
  PCharPtr:= @(mesaj);
  Size:=SizeOf(mesaj);
  SysFileHandle := OpenFile(pchar(pcSysFileName),FileInfo,OF_READ);
  if FileInfo.nErrCode <> 0 then
    begin    {dosya bulunamiyorsa yeni bir dosya yarat:}
    end
   else
    begin
      ErrCode :=_lRead(SysFileHandle,PCharPtr,Size);
      ErrCode :=_lClose(SysFileHandle);
    end;


  for i := 1 to MAX_MESAJ_SAYISI do
    if mesaj[i].dolumu then
     newnote(i,mesaj[i].mesaj,mesaj[i].formH,mesaj[i].formw,mesaj[i].formt,mesaj[i].forml);

end;

procedure kaydet;
var PCharPtr:PChar;
    size:longint;
    SysFileHandle:Integer;
    FileInfo:TOFSTRUCT;
    ErrCode:LongInt;
    ch : Char;
    pcSysFileName:string;
begin
pcSysFileName:=ExtractFilePath(Application.ExeName)+'data.dat';
PCharPtr:= @(mesaj);
Size:=SizeOf(mesaj);
SysFileHandle := OpenFile(pchar(pcSysFileName),FileInfo,OF_WRITE);
if FileInfo.nErrCode = 2 then
 begin{FileNotFound}
  SysFileHandle:=OpenFile(pchar(pcSysFileName),FileInfo,OF_CREATE);
  if SysFileHandle < 0 then
    begin
     MessageDlg('Kayıt Dosyası Yaratılamıyor!',mtError,[mbCancel],0);
     exit;
    end;
   ErrCode:=_lClose(SysFileHandle);
   SysFileHandle := OpenFile(pchar(pcSysFileName),FileInfo,OF_WRITE);
 end;

ErrCode:=_lWrite(SysFileHandle,PCharPtr,Size);
if ErrCode < Size then
   MessageDlg('Sistem dosyasina yazilamiyor.Dosya silinmis ya da bir disk hatasi olusmus olabilir',mtError,[mbCancel],0);
ErrCode:=_lClose(SysFileHandle);
If ErrCode <> 0 then
   MessageDlg('Sistem dosyasi kapatilamiyor!',mterror,[mbCancel],0);

end;
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

ilginize teşekkür ederim
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
Cevapla