跪求文件异步读写例子

Kelthon 2010-09-13 05:39:53
如题,要一个关于使用win32sdk的readfile、writefile或readfileex、writefileex来进行文件异步读写的delphi例子,只要实例代码,能真正读写一个文件,别吹水很简单,怎么用就行了。。。谢谢!!!
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂的犹太人 2011-05-20
  • 打赏
  • 举报
回复
这么复杂
SQLDebug_Fan 2010-09-14
  • 打赏
  • 举报
回复
我知道一般异步读写用完成端口
Kelthon 2010-09-14
  • 打赏
  • 举报
回复
使用事件句柄方式
const
SIMULTANEOUS_OPERATIONS = 3;

procedure PerformAsynchronousRead( const fileName : string );
var
f : THandle;
overlaps : array[0..SIMULTANEOUS_OPERATIONS-1] of TOverlapped;
events : array[0..SIMULTANEOUS_OPERATIONS-1] of THandle;
desiredSize : DWORD;
readSize : DWORD;
readResult : Bool;
buffers : array[0..SIMULTANEOUS_OPERATIONS-1] of PInteger;
i : DWORD;
j : Integer;
value : Integer;
currentValue : PInteger;
begin
f := CreateFile( PChar(fileName),
GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING, 0 );
if f = INVALID_HANDLE_VALUE then begin
WriteLn( 'Unable to open ' + fileName );
Exit;
end;
try
desiredSize := GetFileSize( f, nil ) div SIMULTANEOUS_OPERATIONS;

for i := 0 to SIMULTANEOUS_OPERATIONS - 1 do begin
events[i] := CreateEvent( nil, true, false, nil );
if events[i] = INVALID_HANDLE_VALUE then
RaiseLastOSError;
// Initialize the OVERLAPPED structure
FillChar(overlaps[i], SizeOf(overlaps[i]), 0);
overlaps[i].Offset := desiredSize * i;
overlaps[i].hEvent := events[i];

buffers[i] := VirtualAlloc( nil, desiredSize, MEM_COMMIT, PAGE_READWRITE );
end;

for i := 0 to SIMULTANEOUS_OPERATIONS - 1 do begin
// Request the data
readResult := ReadFile( f, buffers[i]^, desiredSize, readSize, @overlaps[i] );
if readResult then
WriteLn( 'Request performed as synchronous' )
else begin
if GetLastError = ERROR_IO_PENDING then begin
WriteLn( 'Request performed as ASYNCHRONOUS' );
WriteLn( 'Request queued...' );
end
else begin
RaiseLastOSError;
end;
end;
end;

// Do something useful here...
if WaitForMultipleObjects( SIMULTANEOUS_OPERATIONS,
PWOHandleArray(@events), true, INFINITE ) =
WAIT_FAILED then
RaiseLastOSError;

// Check result
for i := 0 to SIMULTANEOUS_OPERATIONS - 1 do begin
readResult := GetOverlappedResult( f, overlaps[i], readSize, False );
if not readResult then
RaiseLastOSError;
end;

WriteLn( 'Requests completed.' );

for i := 0 to SIMULTANEOUS_OPERATIONS - 1 do begin
VirtualFree( buffers[i], desiredSize, MEM_RELEASE );
CloseHandle( events[i] );
end;
finally
CloseHandle(f);
end;
end;
Kelthon 2010-09-14
  • 打赏
  • 举报
回复
使用文件句柄方式读
procedure PerformAsynchronousRead( const fileName : string );
var
f : THandle;
overlap : TOverlapped;
desiredSize : DWORD;
readSize : DWORD;
readResult : Bool;
buffer : PInteger;
currentValue : PInteger;
i : Integer;
begin
f := CreateFile( PChar(fileName),
GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING, 0 );
if f = INVALID_HANDLE_VALUE then begin
WriteLn( 'Unable to open ' + fileName );
Exit;
end;
try
// Initialize the OVERLAPPED structure
FillChar(overlap, SizeOf(overlap), 0);
overlap.Offset := 0;

desiredSize := GetFileSize( f, nil );
buffer := VirtualAlloc( nil, desiredSize, MEM_COMMIT, PAGE_READWRITE );
try
// Request the data
readResult := ReadFile( f, buffer^, desiredSize, readSize, @overlap );
if readResult then
WriteLn( 'Request performed as synchronous' )
else if GetLastError = ERROR_IO_PENDING then begin
WriteLn( 'Request performed as ASYNCHRONOUS' );
// Do something useful here...
WriteLn( 'Request queued...' );
WaitForSingleObject(f, INFINITE);
WriteLn( 'Request completed.' );

readResult := GetOverlappedResult( f, overlap, readSize, False );
if not readResult then
RaiseLastOSError;
end
else
RaiseLastOSError;
finally
VirtualFree( buffer, desiredSize, MEM_RELEASE );
end;
finally
CloseHandle(f);
end;
end;
Kelthon 2010-09-14
  • 打赏
  • 举报
回复
异步读写不一定用完成端口,但完成端口一定要用异步读写
L3nnon 2010-09-14
  • 打赏
  • 举报
回复
帮一帮你












注意你几天了。。










推上去。。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧