none
关于WriteFile函数中lpOverlapped 的疑问 RRS feed

  • 问题

  • 使用内存映射文件的时候,对文件的操作使用的是win32 api函数,我在进行些写文件的时候,想要在文件末尾追加,以往的文件操作函数在打开文件的时候直接以追加模式打开即可,api好像没有这个功能。。。。。要追加得设定偏移地址,我的 函数如下:
    void FileMapping::Add_Data()
    {
    	//char DataBuffer[] = "This is a test string.";
    	BOOL nError;
    	DWORD dwLastError;
    	unsigned long test[2];
    	test[0] = 10;
    	test[1] = 11;
    
    	DWORD dwBytesToWrite = (DWORD)sizeof(unsigned long)*2;
    	DWORD offset;
    	OVERLAPPED over_lap;
    	offset = sizeof(unsigned long)*2;
    	over_lap.Offset = offset;
    
    
    	nError = WriteFile(hFile,(LPCVOID)&test,dwBytesToWrite,&NumberOfWritten,&over_lap);
    	dwLastError = GetLastError();
    }

    如上我设定了lpOverlapped参数,不过只设定了其中的一个参数offset,但是我调试的时候WriteFile函数返回0,说明没有返回成功,不知道为什么,打开文件我用个的是
    CreateFile("test.bat",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

    msdn上说打开时可以不指定FILE_FLAG_OVERLAPPED属性,这样函数完成后才会返回。

    问题是怎么也写不进去。。。高手指教一下

    2010年4月8日 13:39

答案

  • 我没有看到你用内存映射文件阿?你的CreateFile打开的是个普通文件吧?

    overlap那个位置可以直接填NULL.

    普通文件追加的话,可以使用OPEN_EXISTING然后自己把文件指针用SetFilePointer设置到文件末尾再写就可以了。

    或者直接用C标准库的fopen(szFile, "a+");


    0xBAADF00D
    • 已建议为答案 神秘人 2010年4月11日 1:02
    • 已标记为答案 Nancy Shao 2010年4月15日 6:25
    2010年4月10日 13:06
    版主