PDA

View Full Version : اضافه كردن متن به ابتداي يك فايل



smakhavan
چهارشنبه 31 فروردین 1390, 16:34 عصر
سلام
من قبلا (تو دلفي 7) براي اضافه كردن يك متن به يك ابتداي فايل از كد زير استفاده مي‌كردم:


procedure AddTextToFile(Str, Source, Destination : String);
var
stream : TMemoryStream;
s : array[1..2] of String;
i, size : Integer;
begin
SetLength(s[1],length(str));
for i:=1 to length(Str) do s[1][i]:=str[i];

stream:=TMemoryStream.Create;
try
stream.LoadFromFile(Source);
SetLength(s[2],stream.size);
stream.Read(s[2][1],stream.Size);
finally
stream.Free;
end;
stream:=TMemoryStream.Create;
try
size:=length(s[1]);
stream.Write(size,sizeof(size));
stream.Write(s[1][1],size);

size:=length(s[2]);
stream.Write(size,sizeof(size));
stream.Write(s[2][1],size);

stream.SaveToFile(Destination);
finally
stream.Free;
end;
end;



براي حذف كردنش هم از اين كد استفاده ميكردم:

procedure RemoveTextFromFile(var Str:String; Source, Destination : String);
var
s : String;
InFileStream : TFileStream;
OutFileStream: TFileStream;
size : Integer;
begin
InFileStream := TFileStream.Create(Source, fmOpenRead or fmShareDenyNone);
try
InFileStream.Read(size, SizeOf(size));
SetLength(s, size);
InFileStream.Read(s[1], size);
Str:=s;
// Could decrypt the strings here if desired
InFileStream.Read(size, SizeOf(size));
SetLength(s, size);
InFileStream.Read(s[1], size);
if Destination <> '' then
begin
// Write new file
OutFileStream := TFileStream.Create(Destination,fmCreate or fmOpenWrite or fmShareExclusive);
try
OutFileStream.Write(s[1], size)
finally
OutFileStream.Free
end;
end;
finally
InFileStream.Free
end;
end;


ولي الان تو دلفي 2010 جواب نميده! يعني رشته‌اي متفاوت با آن چيزي كه قبلا ابتداي فايل نوشته شده بود برمي‌گردونه.
كسي ميتونه راهنمايي كنه كه اشكالش چيه؟

tdkhakpur
چهارشنبه 31 فروردین 1390, 22:35 عصر
كسي ميتونه راهنمايي كنه كه اشكالش چيه؟

علتش این هست که دلفی 2010 از یونیکد استفاده میکنه که داده در ان دو بایت طول داره در صورتی که قبلا از حالت کد اسکی استفاده کردید که یک بایت طول داشت.

BORHAN TEC
پنج شنبه 01 اردیبهشت 1390, 07:58 صبح
علتش این هست که دلفی 2010 از یونیکد استفاده میکنه که داده در ان دو بایت طول داره در صورتی که قبلا از حالت کد اسکی استفاده کردید که یک بایت طول داشت.
توجه داشته باشید که در یونیکد همیشه یک کاراکتر دو بایت طول ندارد. یونیکد انواع مختلفی دارد که طول کاراکتر در آنها متفاوت است. برخی از این نوع ها به همراه طول آنها در زیر آمده است:

utf-8 که در آن هر کاراکتر 2 تا 4 بایت طول دارد
utf-16 که در آن هر کاراکتر 2 بایت طول دارد
utf-32 که در آن هر کاراکتر 4 بایت طول دارد

یک نکته دیگر: به طور پیش فرض دلفی 2010 و XE از utf-16 استفاده می کنند ولی در نظر داشته باشید که در نسخه های آینده دلفی ممکن است اینگونه نباشد. فکر می کنم که اینرا آقای Seppy Bloom از گروه توسعه دهنده دلفی فرموده بودند، البته زیاد مطمئن نیستم! :متفکر:

tdkhakpur
پنج شنبه 01 اردیبهشت 1390, 14:04 عصر
توجه داشته باشید که در یونیکد همیشه یک کاراکتر دو بایت طول ندارد. یونیکد انواع مختلفی دارد که طول کاراکتر در آنها متفاوت است. برخی از این نوع ها به همراه طول آنها در زیر آمده است:

utf-8 که در آن هر کاراکتر 2 تا 4 بایت طول دارد
utf-16 که در آن هر کاراکتر 2 بایت طول دارد
utf-32 که در آن هر کاراکتر 4 بایت طول دارد

یک نکته دیگر: به طور پیش فرض دلفی 2010 و XE از utf-8 استفاده می کنند ولی در نظر داشته باشید که در نسخه های آینده دلفی ممکن است اینگونه نباشد. فکر می کنم که اینرا آقای Seppy Bloom از گروه توسعه دهنده دلفی فرموده بودند، البته زیاد مطمئن نیستم! :متفکر:
منظور ما هم دلیل این اختلاف در بازیابی داده بود.

smakhavan
یک شنبه 04 اردیبهشت 1390, 15:14 عصر
خوب حالا چه جوري بهش بگم از همان يك كاراكتر استفاده كنه!؟

vcldeveloper
یک شنبه 04 اردیبهشت 1390, 16:55 عصر
utf-8 که در آن هر کاراکتر 2 تا 4 بایت طول دارد
طول کارکتر در UTF-8 بین 1 تا 4 بایت هست.


خوب حالا چه جوري بهش بگم از همان يك كاراكتر استفاده كنه!؟
استفاده از RawByteString به جای String و PAnsiChar به جای PChar، و AnsiChar به جای Char.

BORHAN TEC
یک شنبه 04 اردیبهشت 1390, 19:48 عصر
طول کارکتر در UTF-8 بین 1 تا 4 بایت هست.
برای حصول اطمینان دوباره به یک مقاله معتبر مراجعه کردم. در پست قبل من تعداد بایت ها را اشتباه نوشته بودم.:خجالت: شکل درست آنها به شکل زیر است:

utf-8 که در آن هر کاراکتر 1 تا 4 بایت طول دارد
utf-16 که در آن هر کاراکتر 2 و یا 4 بایت طول دارد
utf-32 که در آن هر کاراکتر 4 بایت طول دارد