PDA

View Full Version : تکه تکه کردن یک فایل



nightHunter
چهارشنبه 08 خرداد 1387, 16:59 عصر
سلام

لطفا راهنمایی بفرمایید که چطور میتونم یک فایل رو مثلا با حجم 200 کیلوبایت به ده فایل 20 کیلوبایت تبدیل کنم و دوباره اونها رو به فایل اصلی برگردونم ؟

سپاسگزارم .

مهران موسوی
چهارشنبه 08 خرداد 1387, 17:13 عصر
بهترين كار استفاده از TfileStream و TMemoryStream هستش ... مثالهاي متعددي تا به حال براي اين كلاسها در اين بخش مطرح شده ... حتي فكر ميكنم براي تكه كردن فايل هم قبلنا توي همين انجمن مثالي ديده بودم .. با مراجعه به قسمت جستجو در انجمن يا با استفاده از جستجو توسط گوگل كه در بالاي صفحه قرار داره ميتونيد نتيجه ي مناسبي رو بگيريد ...

يا حق ...

B_YAGHOBI
چهارشنبه 08 خرداد 1387, 17:19 عصر
// Split file

{
Parameters:

FileToSplit: Specify a file to split.
SizeofFiles: Specify the size of the files you want to split to (in bytes)
Progressbar: Specify a TProgressBar to show the splitting progress

Result:
SplitFile() will create files FileName.001, FileName.002, FileName.003 and so on
that are SizeofFiles bytes in size.
}

function SplitFile(FileName : TFileName; SizeofFiles : Integer; ProgressBar : TProgressBar) : Boolean;
var
i : Word;
fs, sStream: TFileStream;
SplitFileName: String;
begin
ProgressBar.Position := 0;
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do
begin
SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
try
if fs.Size - fs.Position < SizeofFiles then
SizeofFiles := fs.Size - fs.Position;
sStream.CopyFrom(fs, SizeofFiles);
ProgressBar.Position := Round((fs.Position / fs.Size) * 100);
finally
sStream.Free;
end;
end;
finally
fs.Free;
end;

end;



// Combine files

{
Parameters:

FileName: Specify the first piece of the splitted files
CombinedFileName: Specify the combined file name. (the output file)

Result:
CombineFiles() will create one large file from the pieces
}

function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean;
var
i: integer;
fs, sStream: TFileStream;
filenameOrg: String;
begin
i := 1;
fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
try
while FileExists(FileName) do
begin
sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
fs.CopyFrom(sStream, 0);
finally
sStream.Free;
end;
Inc(i);
FileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
end;
finally
fs.Free;
end;
end;




// Examples:
procedure TForm1.Button1Click(Sender: TObject);
begin
SplitFile('C:\temp\FileToSplit.chm',10, ProgressBar1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CombineFiles('C:\temp\FileToSplit.001','H:\temp\Fi leToSplit.chm');
end;