Владимир писал(а):Alex2013 писал(а):1 Флешки обычно размечают в Fat32 (или ExtFat)
2 "Второй упор" возможно связан с типом переменной i ( нужен Cardinal или int64)
1. Работаю с флешкой как с устройством /dev/sdb
2. var i:Longint; максимум=32768 (16Гб)
Еще одна возможная причина:
BlockRead и BlockWrite это легаси функции так что возможно что их просто никто не проверял на работу с большими файлами в современных ОС. Так что попробуй работать через TFileSteam
Простейший способ.
Код: Выделить всё
function CopyFile(src,dst:string):boolean;
var
_src:TSream; // Поток
_dst:TStream;
begin
try
_src:=TFileStream.create(src); // создаем файловый поток по указанному имени исходного файла
_dst:=TFileStream.create(dst); // создаем файловый поток по указанному имени конечного файла
_dst.copyfrom(_src); // копируем поток
_src.free; // очищаем все за собой
_dst.free; // и это тоже....
Copyfile:=true;
// Если что то пошло не так то возвращаем неудачу!!!
except
Copyfile:=false;
end;
end;
Копирование "По блокам "
Код: Выделить всё
procedure FileCopy(aInFile, aOutFile: string; StartPos:int64; Len:int64);
const
BuffSize = 100000;
var
Buff: array [1 .. BuffSize] of Byte;
InFile, OutFile: TFileStream;
begin
InFile := TFileStream.Create(aInFile, fmOpenRead);
InFile.Seek(pos, soFromBeginning);
OutFile := TFileStream.Create(aOutFile, fmCreate or fmOpenWrite);
while InFile.Position < (pos+LEN) do
begin
InFile.ReadBuffer(Buff, BuffSize);
OutFile.WriteBuffer(Buff, BuffSize);
end;
FreeAndNil(InFile);
FreeAndNil(OutFile);
end;
Ну и ещё есть функция CopyFile
Код: Выделить всё
uses ..., FileUtils;
// 1st_variant
function CopyFile(const SrcFilename: String;const DestFilename: String):Boolean;
// 2nd_variant
function CopyFile(const SrcFilename: String;const DestFilename: String;PreserveTime: Boolean):Boolean;
Добавлено спустя 11 минут 59 секунд:
Более продвинутый код для копирования через BlockRead и BlockWrite
Код: Выделить всё
Function FileCopy(SFileName,DFileName : Shortstring;Var n : byte) : Integer;
Const
BufSize = 65536;
Type
TBuf = array [1..65536] of byte;
PTBuf = ^TBuf;
Var
i,ii : Longint;
buf : PTBuf;
SFile ,
DFile : File of Byte;
FSize : Longint;
IOR : integer;
FTime : Longint;
begin
FileCopy := 0;
N := 0;
Assign(SFile,SFileName);
{$i-}
reset(SFile,1);
{$i+}
IOR := IOResult;
if IOR <> 0 Then
begin
FileCopy := IOR;
N := 1;
exit
end;
assign(DFile,DFileName);
if Not Exist_File(DFileName) then
begin
{$i-}
rewrite(DFile,1)
{$i+}
end
else
begin
{$i-}
reset(DFile,1);
truncate(DFile)
{$i+}
end;
IOR := IOResult;
if IOR <> 0 Then
begin
FileCopy := IOR;
N := 2;
exit
end;
New(Buf);
for i := 1 to FileSize(SFile) div BufSize do
Begin
BlockRead(SFile,Buf^,BufSize);
BlockWrite(DFile,Buf^,BufSize)
end;
ii := FileSize(SFile) mod BufSize;
if ii <> 0 Then
Begin
BlockRead(SFile,Buf^,ii);
BlockWrite(DFile,Buf^,ii)
end;
Dispose(Buf);
GetFTime(SFile,FTime);
SetFTime(DFile,FTime);
Close(SFile);
Close(DFile);
end;
Хотя возможно хватит и этого
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
const
Fn1 = 'file1.dat';
Fn2 = 'file2.dat';
Size = 100000;
var
F1, F2 : File;
Buff : array[1..Size] of Byte;
Cnt : Integer;
begin
AssignFile(F1, Fn1);
Reset(F1, 1);
AssignFile(F2, Fn2);
Rewrite(F2, 1);
while not Eof(F1) do begin
BlockRead(F1, Buff, Size, Cnt);
BlockWrite(F2, Buff, Cnt);
end;
CloseFile(F1);
CloseFile(F2);
end;