Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-63777
Fuinadan
2003-02-03 20:14
2003.02.20
XP, NTFS & FAT32


3-63535
Sergeyy
2003-02-03 14:11
2003.02.20
Фильтрация по lookup ам


1-63678
NOE
2003-02-11 17:22
2003.02.20
Отрезок времени меньше 1 милисекунды


9-63462
Ev_genus
2002-08-22 20:32
2003.02.20
Всем не трудоустроенным


4-63910
mate
2003-01-10 11:00
2003.02.20
Нажатие клавиши Ctrl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский