Форум: "Основная";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
ВнизКоприую файл с винта на дискету. Как проверить нормально Найти похожие ветки
← →
iNew (2003-02-11 07:28) [0]он скопировался или нет. Если попытаться скопировать обратно с дискеты на винт, то файл берется из буфера. Можно ли как-то сбросить этот буфер.
← →
uw (2003-02-11 08:27) [1]Вынимаешь дискету и вставляешь ее обратно.
← →
iNew (2003-02-11 08:58) [2]>uw Это понятно. Я имел ввиду можно ли как-то это сделать прграммно.
← →
Кот Бегемот (2003-02-11 09:19) [3]FlushFileBuffers()
← →
iNew (2003-02-11 09:37) [4]Сделал так
procedure TPrintForm.cf(const FileName, DestName: TFileName);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Byte;//Char;
begin
try
AssignFile(FromF, FileName);
Reset(FromF, 1); { Record size = 1 }
AssignFile(ToF,DestName); { Open output file }
Rewrite(ToF, 1); { Record size = 1 }
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
except
on E : EInOutError do
begin
ShowMessage(SysErrorMessage(E.ErrorCode));
exit;
end;
end;
FlushFileBuffers(TFileRec(ToF).Handle);
FlushFileBuffers(TFileRec(FromF).Handle);
CloseFile(FromF);
CloseFile(ToF);
end;
Всё равно берет из буфера.
← →
Anatoly Podgoretsky (2003-02-11 09:44) [5]Отказ от Паскалеских процедур в пользу АПИ - CreateFile и далее
← →
alexdbases (2003-02-11 09:56) [6]или просто очисть буфер ...а потом скопируй...на винт :)
← →
iNew (2003-02-11 09:58) [7]> Anatoly Podgoretsky хоршо сделал так
procedure CopyFile(const FileName, DestName: TFileName);
var
CopyBuffer: Pointer; { buffer for copying }
BytesCopied: Longint;
Source, Dest: Integer; { handles }
const
ChunkSize: Longint = 8192; { copy in 8K chunks }
begin
GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
try
Source := FileOpen(FileName, fmShareDenyWrite); { open source file }
if Source < 0 then ShowMessage("Error");
try
Dest := FileCreate(DestName); { create output file; overwrite existing }
if Dest < 0 then ShowMessage("Error");
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
if BytesCopied > 0 then { if we read anything... }
FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
until BytesCopied < ChunkSize; { until we run out of chunks }
finally
FlushFileBuffers(Dest);
FileClose(Dest); { close the destination file }
end;
finally
FlushFileBuffers(Source);
FileClose(Source); { close the source file }
end;
finally
FreeMem(CopyBuffer, ChunkSize); { free the buffer }
end;
end;
И опять берет из буфера
← →
Dikobrazz (2003-02-11 10:01) [8]Если открывать файл через WinAPI, есть возможность указать флаг, запрещающий кэширование (FILE_FLAG_NO_BUFFERING)
Вот пример, записывающий файл, а потом его читающий:
procedure Test;
var
FileName: string;
Sz: integer;
HFile: cardinal;
Buf: pointer;
Wrt: DWORD;
begin
FileName:="A:\test.bin";
Sz:=512000;
HFile:=CreateFile(PChar(FileName),GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL + FILE_FLAG_NO_BUFFERING, 0);
Buf:=AllocMem(Sz);
FillMemory(Buf,Sz,$AA);
WriteFile(HFile,Buf^,Sz,Wrt,nil);
FlushFileBuffers(HFile);
CloseHandle(HFile);
ShowMessage("Written");
CreateFile(PChar(FileName),GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL + FILE_FLAG_NO_BUFFERING, 0);
ReadFile(HFile,Buf^,Sz,Wrt,nil);
CloseHandle(HFile);
FreeMem(Buf);
end;
← →
Anatoly Podgoretsky (2003-02-11 10:14) [9]Написал же, использовать АПИ и функцию прямо указал CreateFile, а ты что, бери пример от Dikobrazz (11.02.03 10:01), вот он прислушался
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c