ايران ويج

نسخه‌ی کامل: FileStream در دلفی
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام.
اگه بخوام دیتاهای چند فایل رو توی یه فایل کپی کنم چیکار کنم؟
مثلاً 10 فایل دارم که میخوام محتویات اونا رو به ترتیبی که دوست دارم توی یه فایل کلی کپی کنم.
با یستی یه استانداردی ایجاد کنین و طبق اون بخونین و بنویسین مثلا 2 بایت برای طول و بعد اطلاعات به همین ریتم اطلاعات رو تو فایل مینویسین و برای خوندن هم 2بایت طول رو میخونین و بعد به همون اندازه اطلاعاتو میخونین
منظورم از " ترتیبی که دوست دارم " ترتیب محتویات درون فایل نیست.
میخوام تمام محتویات 10 فایلو توی یه فایل جمع کنم.
بینین برای این کار شما به 2 پارامتر نیاز دارین اطلاعات فایل و طول اون فایلی رو که میخواهین اطلاعات رو توش بریزین رو باز میکنین file0 و فایلی رو که میخواهین اطلاعات از اون خونده بشه رو هم باز میکنین file1 حالا اطلاعات مورد نظر رو از فایل 1 میخونیم مثلا شد یه buffer به طول 589 بایت خب حالا این اطلاعات رو به file0 انتقال میدیم و بعد مقدار طول رو مینویسیم پس طولی که به file0 اضافه کردیم برابر 589+3 خواهد بود حالا file2 رو باز میکنیم و اطلاعاتشو تو یه بافر میریزیم مثلا طول این بافر شد 215 تا حالا اینو بهfile0 انتقال میدیم و بعد از اون طول اونو فرار میدیم که طول اون بربر 215 هست که 3 بایت میشه پس طولی که ما به file0 اضافه کردیم 215+3 هست برای فایلهای بعدی هم به همین منوال نجام میدیم توجه داشته باشین که مقدار طول فایل رو بایت ثابت در نظر بگیرین مثلا اگه تو 10 فایل یه فایل به حجم 125478 دارین طول بافرها رو به جای 3 بایت 6 بایت در نظر بگیرین البته میشه اینو به صورت دینامیک هم ایجاد کرد ولی در حالت اول راحتره


حالا برای خواندن اطلاعات file0 رو باز میکنین 3 بایت اخر رو میخونین که طول بافر رو نشون میده مثلا نوشته 215 حالا از انتهای فایل 215+3 بایت میاین عقب و 215 بایت رو میخونین بعد 3 بایت عقبتر میرین و طول اطلاعات بعدی رو میخونین که میشه 3+215+3 که مثلا نوشته 569 حالا از انتهای فایل 3+215+3+569 بایت عقب میرین و 569 بایت رو میخونین و به همین ترتیب ادامه میدین تا اخر
من اینکارو کردم:
کد php:
begin
 NewFile 
:= TFileStream.Create('c:\Edit.txt'fmCreate);
 for 
i:=1 to 4 do
 
begin
 OldFile 
:= TFileStream.Create('c:\'+IntToStr(i)+'.txt ', fmOpenRead );
 NewFile.CopyFrom(OldFile,fmOpenRead);
 FreeAndNil(OldFile);
 end;
 FreeAndNil(NewFile);
end; 

میخوام یه opendialog بذارم و تعدادی فایل رو دونه دونه انتخاب کنم و بریزم تو آرایه ...
با چه دستوری اندیس های آرایه رو میشه جابجا کرد؟
سلام.
کدهای یه فایل فلش رو درون یه فایل ذخیره کردم.
برا تبدیل مجدد آن به یک انیمیشن آون رو با یه حلقه خوندم که موفقیت آمیز بود.
مشکل اینجاست که وقتی حلقه اجرا میشه دیگه هیچ کاری نمیشه کرد (حتی نمیشه برنامه رو بست !!!)

مشکل کجاست؟ راهی به نظرتون میرسه؟
امیدوارم بدردتون بخورد
موفق باشد شبح
کد:
////////////////////////////////////////////////////////////////////////////////
///////////////////// اضافه کردن اطلاعات به فايل ايکزه //////////////////////////

Function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgr??e speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;

Function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;

try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgr??e gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;

procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile('Test.exe', aStream);
aStream.Free;
end;

procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile('Test.exe', aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;

////////////////////////////////////////////////////////////////////////////////

کد:
////////////////////////////////////////////////////////////////////////////////
/////////////////////////// جدا کردن يک فايل ///////////////////////////////////

procedure SplitFile(FileName : TFileName; FilesByteSize : Integer) ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;
// SplitFile(edit1.Text ,40000); طریقه استفاده باید آدرس یک فایل را بنویسید و به چند بایت باید تقسیم شود

////////////////////////////////////////////////////////////////////////////////
////////////////////// متصل کردن فايل جدا شده //////////////////////////////////

procedure MergeFiles(FirstSplitFileName, OutFileName : TFileName) ;
// FirstSplitFileName == the name of the first piece of the split file
// OutFileName == the name of the resulting merged file
var
fs, ss: TFileStream;
cnt: integer;
begin
cnt := 1;
fs := TFileStream.Create(OutFileName, fmCreate or fmShareExclusive) ;
try
while FileExists(FirstSplitFileName) do
begin
ss := TFileStream.Create(FirstSplitFileName, fmOpenRead or fmShareDenyWrite) ;
try
fs.CopyFrom(ss, 0) ;
finally
ss.Free;
end;
Inc(cnt) ;
FirstSplitFileName := ChangeFileExt(FirstSplitFileName, Format('%s%d', ['._',cnt])) ;
end;
finally
fs.Free;
end;
end;
// MergeFiles('C:\New Folder\Entekhabat._1','C:\New Folder\Ent.mdb'); طریقه استفاده اول بایت اولی را میدهید و بعد فایل اصلی که با آن نام باید ساخته شود

////////////////////////////////////////////////////////////////////////////////

(۲۸-شهریور-۱۳۸۸, ۱۴:۰۳:۳۴)iman-63 نوشته است: [ -> ]سلام.
کدهای یه فایل فلش رو درون یه فایل ذخیره کردم.
برا تبدیل مجدد آن به یک انیمیشن آون رو با یه حلقه خوندم که موفقیت آمیز بود.
مشکل اینجاست که وقتی حلقه اجرا میشه دیگه هیچ کاری نمیشه کرد (حتی نمیشه برنامه رو بست !!!)

مشکل کجاست؟ راهی به نظرتون میرسه؟
شما داخل حلقه های طولانی باید از دستور Application.processmessage; استفاده کنید یا پردازشهای طولانی رو درون ترد ها انجام بدید
نقل قول: شما داخل حلقه های طولانی باید از دستور Application.processmessage; استفاده کنید یا پردازشهای طولانی رو درون ترد ها انجام بدید

ممکنه یه مثال بزارین .
این فایل را دانلود کن . Thread در دلفی را به خوبی توضیح داده است
موفق باشید شبح
فقط کافیه این دستور رو در انتهای حلقه بزارید تا mesage های داخل threadدر خلال اجرای حلقه پردازش بشن

کد:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:Integer;
begin
for i:=1 to 10000 do
begin
j:=i*100 div 10;
Caption:=IntToStr(j);
Application.ProcessMessages;
end;

end;
صفحه‌ها: 1 2