今天跟大家聊聊我昨天遇到的一个坑,关于CreateFile
函数调用失败的。这玩意儿,看着简单,实际用起来真能让人头大。
事情是这样的,昨天我在搞一个文件读写的程序,需要用到CreateFile
来打开或者创建一个文件。代码很简单,就几行,但是我一运行,死活创建不成功!返回的句柄是INVALID_HANDLE_VALUE
,错误码是5,也就是“拒绝访问”。
我以为是路径写错,赶紧检查一遍,路径是绝对路径,文件夹也存在,看起来没啥问题。我又试试相对路径,还是不行。难道是文件名有问题?我把文件名改成最简单的"*",还是跪!
折腾半天,我开始怀疑是不是权限问题。因为错误码提示的是“拒绝访问”,我寻思是不是当前用户没有权限在这个目录下创建文件。于是我右键文件夹,安全选项卡,把当前用户的权限改成“完全控制”。重新运行程序,还是不行!我真是要崩溃。
没办法,只能开始Google。网上搜一大堆,各种说法都有,什么文件被占用,磁盘空间不足等等。我一一排查,文件肯定没被占用,磁盘空间也足够。难道是我的代码有问题?
我把代码贴出来,仔仔细细地检查,发现CreateFile
的参数里有一个dwShareMode
,这个参数控制着文件的共享模式。我之前设置的是0,也就是独占模式。我突然想到,会不会是其他程序也在试图访问这个文件,导致我的CreateFile
失败?
为验证这个想法,我把dwShareMode
改成FILE_SHARE_READ FILE_SHARE_WRITE
,也就是允许其他程序读写共享。重新编译运行,这回居然成功!文件创建成功!
总结一下这回踩坑的经验:
CreateFile
失败的原因有很多,权限问题、路径问题、文件被占用等等。- 一定要仔细检查
CreateFile
的参数,尤其是dwShareMode
,这个参数很容易被忽略。 - 遇到问题不要慌,先Google一下,看看有没有类似的案例。
虽然这回只是一个很小的坑,但是也让我学到很多。希望我的经验能帮到大家,避免踩同样的坑。