首页
社区
课程
招聘
[求助]写一个读写硬盘的东西,设置文件指针的时候出错[已解决]
发表于: 2008-6-11 07:09 5774

[求助]写一个读写硬盘的东西,设置文件指针的时候出错[已解决]

2008-6-11 07:09
5774
这段是错误演示代码,代码如下:


[color=#FF0000]#include <afxwin.h>

[color=#008000]// 输出错误信息
[color=#0000FF]void printerr()
{
    DWORD dwError;
    
    [color=#0000FF]if (dwError = GetLastError() != NO_ERROR )
    {
        [color=#0000FF]char ErrorText[512]=[color=#FF00FF]"";
        [color=#0000FF]char ErrorMsg[400]=[color=#FF00FF]"";
        LPVOID lpMsgBuf;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| [color=#008000]//自动分配消息缓冲区
            FORMAT_MESSAGE_FROM_SYSTEM, [color=#008000]//从系统获取信息
            NULL,GetLastError(), [color=#008000]//获取错误信息标识
            MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),[color=#008000]//使用系统缺省语言
            (LPTSTR)&lpMsgBuf, [color=#008000]//消息缓冲区
            0,
            NULL);
        sprintf(ErrorMsg, [color=#FF00FF]"%s 由于以下错误而失败: %s",ErrorText,lpMsgBuf);
        MessageBox(NULL,ErrorMsg, [color=#FF00FF]"错误", MB_ICONSTOP);[color=#008000]//弹出错误提示框        
    }
}

[color=#0000FF]void main()
{
    [color=#0000FF]char szFile[] = [color=#FF00FF]"\\\\?\\C:";
    HANDLE hFile = CreateFile(szFile,
        GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    DWORD dCheck;
    dCheck = SetFilePointer(hFile,
        0x10,
        NULL,
        FILE_CURRENT
        );    [color=#008000]// 这里出错
    [color=#0000FF]if (dCheck == -1)
    {
        [color=#008000]// 输出错误信息
        printerr();
    }
}


在SetFilePointer处出错了,错误信息是“参数错误”。但是如果是对于一个文件这段代码却不会出错。难道CreateFile逻辑磁盘的时候不能设定文件指针吗?
不明白,求解

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
2
SetFilePointer函数里的第二个参数的单位是字节吧?你程序的意思是读第0x10个字节。
要读磁盘得读整个扇区,你是想读第0x10个扇区呢还是读第0x10个字节呢?
想读扇区0x10得乘上扇区的字节数,想读第0x10个字节得读一个扇区之后再从里面取~
2008-6-11 18:39
0
雪    币: 238
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
需要吗,CreateFile以后不就是相当于文件操作了吗?
我这里的0x10只是随便一个偏移量,只是为了表明在SetFilePointer的时候会出错。。

char szPath[] = "\\\\.\\C:";

HANDLE hFile = CreateFile(szPath,
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);
ReadFile(hFile,pBuffer,nDataLength,&nBytesRead,NULL);


这样读是没问题的,随便一次读多少数据,持续ReadFile可以一直读C:的数据。但就是SetFilePointer的时候有问题
2008-6-11 19:57
0
雪    币: 238
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
       
2008-6-11 20:32
0
雪    币: 238
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
Nukou说的没错。刚才没注意到。
呵呵,明白错误出在哪了,果然是因为扇区对齐的原因。

MSDN里也写到了:

Note that all I/O buffers must be sector aligned (aligned on addresses in memory that are integer multiples of the volume's sector size), even if the disk device is opened without the FILE_FLAG_NO_BUFFERING flag.

所有的I/O缓冲区必须是扇区对齐的!


所以:
	dCheck = SetFilePointer(hFile,
		512,
		NULL,
		FILE_CURRENT
		);	// 正常,不出错


thx  Nukou!
2008-6-11 20:32
0
游客
登录 | 注册 方可回帖
返回
//