CreateFile + FILE_APPEND_DATA == 疯狂的Writefile

shyboy_NWPU 2009-12-01 07:21:32
问题是这样的:
HANDLE hTarget = CreateFile( csNewFilePath,
FILE_APPEND_DATA,
FILE_SHARE_READ,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
FILE_APPEND_DATA的方式创建一个文件,然后写入文件:
char pData[] = "0123456789abcdef";

for ( int i = 0; i < g_nRepeateTime; ++i )
{
bWriteRes= WriteFile(hTarget, pData, 16, &dwBytesWritten, NULL);
if ( (0 == bWriteRes) || ( 16 != dwBytesWritten) )
{
ASSERT(0);
CloseHandle(hTarget);
return FALSE;
}
}

疯狂的结果出现了,比如说我将g_nRepeateTime = 10, 结果0123456789abcdef被写入了 > 10次!!也就是说WriteFile重复写入了数据,但是每次bWriteRes != 0 && dwBytesWritten == 16。

把FILE_APPEND_DATA换成GENERIC_READ | GENERIC_WRITE,一切OK.

跪求各位大侠赐教!
...全文
897 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-12-02
  • 打赏
  • 举报
回复
弄个日志文件,在for里面把 i 和 g_nRepeateTime 都打印出来..再到另一个盘中建一堆文件,把每一次 WriteFile 的内容都写到一个不同的文件中。或者是你写到文件的内容本身就有重复了..
shyboy_NWPU 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tr0j4n 的回复:]
怎么这么灵异的?我试了几个平台都没有问题
[/Quote]

我的测试结果是,还与每次写入的数据量有关系-_-!

每次写入的数据量多一点,比如:

CString csNewFilePath = m_csOutPath;
csNewFilePath += "\\1writefile-test.bnd";


HANDLE hTarget = CreateFile( csNewFilePath,
FILE_APPEND_DATA,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( INVALID_HANDLE_VALUE == hTarget )
{
ASSERT(0);
return 1;
}

char pData[80];
int nDataSize = 80;
ZeroMemory(pData, nDataSize);
memcpy(pData, "test", 5);
BOOL bWriteRes = FALSE;
DWORD dwBytesWritten = 0;
g_nRepeateTime = 10;
for ( int i = 0; i < g_nRepeateTime; ++i )
{
bWriteRes= WriteFile(hTarget, pData, nDataSize, &dwBytesWritten, NULL);
if ( (0 == bWriteRes) || ( nDataSize != dwBytesWritten) )
{
ASSERT(0);
CloseHandle(hTarget);
return 1;
}
//SetFilePointer(hTarget, 0, NULL, FILE_END);
}

写完之后,用UltraEdit查看写了几次。
就是上面这段代码,在我有问题的机器上,被写入了12次。
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
怎么这么灵异的?我试了几个平台都没有问题
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 vieri_ch 的回复:]
更新Platform SDK, SDK太老了
[/Quote]

我把代码拿到vs2008上编译,结果还是一样;我没辙了...
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
现在的初步结论是,与FILE_APPEND_DATA这个参数有关;
我反复测试过,只要把这个参数换成GENERIC_READ | GENERIC_WRITE,在有问题的机器上就是正常的。
尘雨 2009-12-01
  • 打赏
  • 举报
回复
更新Platform SDK, SDK太老了
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vieri_ch 的回复:]
你的操作系统是什么,开发环境是?vs6---vs2008?
[/Quote]

我开发的机器是XP Proressional SP3;
用的是VC6.0 SP6
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tr0j4n 的回复:]
我拿了你的代码测试过了,只写了10次
[/Quote]

这种不正常的结果也只是在有的机器上出现,而且是有时出现,有时候又不出现,神出鬼没的。
尘雨 2009-12-01
  • 打赏
  • 举报
回复
你的操作系统是什么,开发环境是?vs6---vs2008?
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
没有重复的
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
我拿了你的代码测试过了,只写了10次
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shyboy_nwpu 的回复:]
我是设置了CREATE_NEW参数,然后创建了一个原来不存在的文件,这时文件指针也就相当于移动到文件末尾了;

关于在在for循环里面每次写完之后,移动文件指针的问题,我在网上找到一篇文章,里面有这么一段:

If only the FILE_APPEND_DATA and SYNCHRONIZE flags are set, the caller can write only to the end of the file, andany offset information on writes to the file is ignored. However, the file will automatically be extended as necessary for this type of write operation.

如果是这样,那么在for循环里面每次写完之后,确实应该移动一下文件指针;
但是还是有个问题,即使在for循环里面写完一次之后没有移动文件指针到末尾,也不应该写重复啊?只是猜想,,,,,,我再测测。。
[/Quote]

经过测试,每次WriteFile之后,SetFilePointer(hTarget, 0, NULL, FILE_END);也不行,还是重复写入了。
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
你用异步的方式写写看会不会重复
尘雨 2009-12-01
  • 打赏
  • 举报
回复
从资料看FILE_APPEND_DATA,是个单一访问权限。不具备同步化的特性
GENERIC_READ | GENERIC_WRITE,这两属性是复合属性,具备以下特性
GENERIC_READ:
----------------
FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE

GENERIC_WRITE:
----------------
FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE

最后一个属性,只针对重叠IO的模式,但我不确定,对于一般的模式下,会不会有影响。只是一个猜测
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
我是设置了CREATE_NEW参数,然后创建了一个原来不存在的文件,这时文件指针也就相当于移动到文件末尾了;

关于在在for循环里面每次写完之后,移动文件指针的问题,我在网上找到一篇文章,里面有这么一段:

If only the FILE_APPEND_DATA and SYNCHRONIZE flags are set, the caller can write only to the end of the file, and any offset information on writes to the file is ignored. However, the file will automatically be extended as necessary for this type of write operation.

如果是这样,那么在for循环里面每次写完之后,确实应该移动一下文件指针;
但是还是有个问题,即使在for循环里面写完一次之后没有移动文件指针到末尾,也不应该写重复啊?只是猜想,,,,,,我再测测。。
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
for循环里面每次你写完,都要移动指针到文件末尾下
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
你的指针移动了吗?
CreateFile之后还需要
SetFilePointer(hFile, 0, NULL, FILE_END);
shyboy_NWPU 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
for ( int i = 0; i < g_nRepeateTime; i++ )

你写多了
[/Quote]
应该不是这里的问题;
有一次我将g_nRepeateTime = 10,结果写入了17次。。。。
MoXiaoRab 2009-12-01
  • 打赏
  • 举报
回复
for ( int i = 0; i < g_nRepeateTime; i++ )

你写多了
目录 本篇简介.............................................................................................................................................................1 目录............................................................................................................................................................................ 3 eoeMarket 中国第一款第三方软件发布平台.......................................................................................................... 5 1. SD 卡概述及深层次介绍(google 来的)..................................................................................................................6 2.在模拟器如何创建、挂载、使用SD 卡.................................................................................................................6 2.1 创建镜像文件...............................................................................................................................................7 2.2 装载SD 卡.................................................................................................................................................... 7 2.3 复制文件.......................................................................................................................................................8 2.4 删除文件.......................................................................................................................................................8 2.5eclispse...........................................................................................................................................................9 3.在代码中如何使用SD 卡..................................................................................................................................... 11 3.1SD 是否可用检查........................................................................................................................................ 11 3.2 卡上数据的读写.........................................................................................................................................11 3.3 File............................................................................................................................................................... 12 3.4 FileFilter.......................................................................................................................................................13 3.5 FileInputStream...........................................................................................................................................14 3.6 FileOutputStream........................................................................................................................................ 14 4.蓝牙简介................................................................................................................................................................15 5.蓝牙设置种常用的Intent .................................................................................................................................... 15 5.1 启动蓝牙.....................................................................................................................................................17 5.2 关闭过程.....................................................................................................................................................21 5.3 配对过程.....................................................................................................................................................22 6.蓝牙模块................................................................................................................................................................23 6.1 蓝牙耳机.....................................................................................................................................................25 6.2Android 跟蓝牙耳机建立连接有两种方式。............................................................................................ 27 7.Wi-Fi 简介.............................................................................................................................................................. 37 8.Android SDK 中Android.net.wifi 简要分析..........................................................................................................38 9.在Android 中扫描wifi 热点演示实例教程.......................................................................................................... 41 【eoeAndroid 特刊】第六期: 数据通信发布版本: Ver 1.0.0(build 2009.07.26) 本文档由eoeAndroid 社区组织策划,整理及发布,版权所有,转载请保留! eoeAndroid 做中国最棒的Android 开发社区 10. wifi 模块分析......................................................................................................................................................45 10.1 初始化.......................................................................................................................................................45 10.2 连接AP.................................................................................................................................................... 46 10.3 查找AP................................................................................................................................................... 47 10.4 配置AP 参数......................................................................................................................................... 48 10.5 连接..........................................................................................................................................................48 10.6 配置IP 地址...........................................................................................................................................49 11.了解HTTP............................................................................................................................................................ 51 11.1 HTTP 协议是什么?................................................................................................................................. 51 11.2 HTTP 协议的主要特点?.......................................................................................................................... 51 11.3 HTTP 协议能做什么?.............................................................................................................................. 51 11.4 HTTP 协议如何工作?.............................................................................................................................. 51 12.HTTP 协议详解.................................................................................................................................................... 52 12.1 HTTP 协议详解之URL 篇.......................................................................................................................... 52 12.2 HTTP 协议详解之请求篇.......................................................................................................................... 52 12.3 HTTP 协议详解之响应篇.......................................................................................................................... 53 12.4 HTTP 协议详解之消息报头篇...................................................................................................................54 13. Android 实例.......................................................................................................................................................57 13.1 通过GET 请求获取数据.......................................................................................................................... 57 13.2 通过POST 提交数据............................................................................................................................... 58 13.3. 小结.........................................................................................................................................................59 14.编后语................................................................................................................................................................. 60 15. 其他................................................................................................................................................................... 61 BUG 提交如果你发现文档中翻译不妥的地方,请到如下地址反馈,我们会定期更新、发布更新后 的版本.......................................................................................................................................................61 资源下载:本期文部分中包含的源码请在如下地址下载.................................................................... 61 加入eoe 特刊小组,为你的将来磨平道路............................................................................................ 61 关于eoeAndroid.......................................................................................................................................62 17. 广告................................................................................................................................................................... 62

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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