Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
Lazarus
|
Re: Probleme mit BlockRead / BlockWrite
19. Dez 2009, 02:49
Hallo JBJHJM.
Wie Luckie schon geschrieben hat, ist Blockread hier nicht unbedingt die optimale Lösung.
Anbei eine mögliche API - Implementierung.
Delphi-Quellcode:
var
hFile : LongWord;
ptrBuffer : pointer = nil;
cbLen : LongWord = 64;
cbRead : LongWord;
szFilePath : PAnsiChar = 'd:\test.txt';
szData : PAnsiChar =
'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855';
begin
//-- Schreiben
GetMem(ptrBuffer, cbLen);
move(szData[0], ptrBuffer^, cbLen);
hFile := CreateFile(szFilePath, GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if hFile = INVALID_HANDLE_VALUE then RaiseLastWin32Error;
if SetFilePointer(hFile, 0, nil, 0) = $FFFFFFFF then RaiseLastWin32Error;
if not WriteFile(hFile, ptrBuffer^, cbLen, cbRead, nil) then
RaiseLastWin32Error;
if not FlushFileBuffers(hFile) then RaiseLastWin32Error;
if cbLen <> cbRead then RaiseLastWin32Error;
if not CloseHandle(hFile) then RaiseLastWin32Error;
FreeMem(ptrBuffer, cbLen);
//-- Lesen
hFile := CreateFile(szFilePath, GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if hFile = INVALID_HANDLE_VALUE then RaiseLastWin32Error;
if SetFilePointer(hFile, 0, nil, 0) = $FFFFFFFF then RaiseLastWin32Error;
GetMem(ptrBuffer, cbLen);
if not ReadFile(hFile, ptrBuffer^, cbLen, cbRead, nil) then
RaiseLastWin32Error;
if cbLen <> cbRead then RaiseLastWin32Error;
if not CloseHandle(hFile) then RaiseLastWin32Error;
Showmessage(PChar(ptrBuffer));
FreeMem(ptrBuffer, cbLen);
end.
lg.Astat
Lanthan Astat 06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
|
|
Zitat
|