WIN32API读取文件流一问

bybyby 2006-09-26 11:24:07
CreateFile(pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTRING);

ReadFile(hFile, pBuffer, iFileLength, &dwBytesRead, NULL);

CloseHandle(hFile);

这是一段在WIN32API编程中,文件读写的代码.能够正确地打开和读取TXT文件.但是我现在需要打开的是一个可执行文件(BIN,EXE).这时候就会出现问题。
因为在读取文本文件的时候,定义的结束的标志的EOF,但可执行文件并无此标志。用上诉代码打开的BIN文件pBuffer只能读取其中的一小段,然后就没有了。
在标准C下,有fOpen(),fbRead()等等函数,让你选择打开或读取的方式(ASCll或二进制)。但我不想回到这种方式,希望用WINAPI提供的异步方式打开。不知道有没有谁能帮忙解决。
我在WINSOCK上遇到同样的问题,Send(sock, buf,0);我不能发送二进制流,而是发送了buf的ASCLL码。虽然我通过一个算法硬把ASCLL数据转成了十六进制发送,但很笨拙。
希望有热心的朋友能帮下我。非常感谢。
...全文
476 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞哥 2006-09-27
  • 打赏
  • 举报
回复
DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);
dwSizeLow = GetFileSize (hFile, & dwSizeHigh)

此函数返回值为文件大小的低位,高位存在第二个参数中,lpFileSizeHigh参数返回
bybyby 2006-09-27
  • 打赏
  • 举报
回复
aaaaaaaaaaaaaaaaaaaaa
du51 2006-09-27
  • 打赏
  • 举报
回复
我记得是-1为结束的.呵呵.不太清楚.猜的.
bybyby 2006-09-27
  • 打赏
  • 举报
回复
up,help me please~~`````````
bybyby 2006-09-27
  • 打赏
  • 举报
回复
// Open the file.

if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL)))
return FALSE ;

// Get file size in bytes and allocate memory for read.
// Add an extra two bytes for zero termination.

iFileLength = GetFileSize (hFile, NULL) ;
pBuffer = malloc (iFileLength) ;

// Read file and put terminating zeros at end.
ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ; //读取出来的大小不正确 遇到0x0,0x0就结束了
CloseHandle (hFile) ;


ReadFile()读取可执行文件如BIN(非文本文件),遇到0x0 0x0就会认为是结束.我现在是想读取一个二进制文件,请问是否可以设置或者用其他函数.
bybyby 2006-09-26
  • 打赏
  • 举报
回复
非常感谢! 请问你这个是MSDN里面的吗,我把FILE相关的章节都看过没,并没看见呀~~~!!!
jixingzhong 2006-09-26
  • 打赏
  • 举报
回复
用2进制文件方式操作
hailongchang 2006-09-26
  • 打赏
  • 举报
回复
The OpenFileMode function sets the mode of the file you want to open or create. The argument you pass as the parameter nMode sets the file mode to one of the following:

Binary file in read/write mode.
Binary file in read-only mode.
After you set the file mode, call OpenFile to open an existing file or CreateFile to create and open a new file.

OpenFileMode ( nMode );

nMode:
FILE_MODE_BINARY
FILE_MODE_BINARYREADONLY
bybyby 2006-09-26
  • 打赏
  • 举报
回复
// Open the file.

if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL)))
return FALSE ;

// Get file size in bytes and allocate memory for read.
// Add an extra two bytes for zero termination.

iFileLength = GetFileSize (hFile, NULL) ; //取出来的大小不正确 遇到0x0,0x0就结束了
pBuffer = malloc (iFileLength) ;

// Read file and put terminating zeros at end.
ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;

飞哥 2006-09-26
  • 打赏
  • 举报
回复
你可以用GetFileSize来取得文件的大小
bybyby 2006-09-26
  • 打赏
  • 举报
回复
我现在用CreateFile()来打开exe或bin文件,发现当文件读取到0x00的时候,程序就认为读取完毕了.所以CreateFile所创建的文件大小总是不对. 请问有什么地方可以设置文件结束标志(用长度来代替\0\0)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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