PDA

View Full Version : split فایل های بزرگ و ثبت آن در دیتابیس بدون کپی روی هارد



mahdy.asia
دوشنبه 12 مرداد 1394, 19:09 عصر
من می خواهم فایل های بزرگ را Split کنم و هر قسمت آن را در جدول ذخیره کنم، کدی که در دسترس دارم فایل ها را split می کند اما آن را روی هارد کپی می نماید و این مورد نظر من نیست و عملیات کپی کار اضافه است.

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;

bobesfanji
سه شنبه 27 مرداد 1394, 09:15 صبح
مقصد شما ss خودش از نوع filestream هست که باید تغییر بدید به memorystream

procedure SplitFile(FileName : TFileName; FilesByteSize : Integer);
var
fs: TFileStream;
ss:tmemorystream; // تغییر کرد
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
ss := TmemoryStream.Create; // تغییر کرد
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
ss.position :=0; // تغییر کرد
table.blobfield.loadfromstream(ss); // تغییر کرد
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;