Hafızadaki diziyi dosyaya kaydetme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
Hafızadaki diziyi dosyaya kaydetme
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
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.
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
Bayt olarak kaydetmek için;
Kolay gelsin...
(Bu text olarak kaydetmiyor. Neden text olarak?)
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;
(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.
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(
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.

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;
.-.-.-.-.-.-.-. ^_^
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul