Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.20;
Скачать: CL | DM;

Вниз

Коприую файл с винта на дискету. Как проверить нормально   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
6-63703
Mischka
2002-12-17 14:49
2003.02.20
LAN tracert 192.168.14.133


14-63800
Strannik.
2003-02-04 07:58
2003.02.20
ПОМОГИТЕ!!! немогу winnt4.0 поставить


14-63742
JibSkeart
2003-02-04 16:51
2003.02.20
А у кого нибуть есть гамеса Abe odyssey 2 ??


3-63504
z_olga_al
2003-02-02 16:10
2003.02.20
SQL


14-63774
Nick-From
2003-02-01 14:22
2003.02.20
хочу сканер