windows内核判断文件是否存在的方法

来源:互联网 发布:照片自动拼接软件 编辑:程序博客网 时间:2024/05/02 04:24

http://hi.baidu.com/xicao54007/item/144a66d728326e1d20e25028

不论在应用层还是在内核层我们经常要判定一个文件是否存在, 在产品开发过程中我看到了该问题的多种实现方法, 这里拿出来和大家分享!

方法一:GetFileAttributes
在Google的Chrome代码中看到的实现方法,利用GetFileAttributes接口的返回值,如果接口返回
INVALID_FILE_ATTRIBUTES则说明文件不存在,反之,则存在!该方法简单好使!

方法二:FindFirstFile
通过查找目录项的方法应该说是最容易想到的一种方法,可是该方法比较繁琐,并且底层文件系统
实现的效率较低(实际项目中测试过);

方法三:CreateFile
通过CreateFile接口的返回值以及GetLastError接口来判定文件是否存在,该方法应该说是原始的、
万能法(在内核中也可以用这种方法来判定文件是否存在);


以上这三种方法一看就知道方法一是最简单、最好用的方法,并且其效率也较高,这是因为GetFileAttributes内部走的是FAST IO接口 - IRP_MJ_NETWORK_QUERY_OPEN,这一个接口 完成了打开文件和查询文件这两个操作,所以它的效率较高。而FindFirstFile接口走的是 IRP_MJ_CREATE和IRP_MJ_DIRECTORY_CONTROL两个接口,先打开目录对象,然后再查询目录项, 当遇到目录项很多时这个接口的效率也会一落千丈,所以我很少使用它;而最后一个 接口CreateFile是最通用的一个接口,它在应用层和内核层都适用,并且在内核层我们无法直接使用 FAST IO接口IRP_MJ_NETWORK_QUERY_OPEN,所以好用的也就是它了,不过在应用层我们通过 GetLastError来获取错误码的,而在内核层直接读状态吗即可。


xicao54007回复Coding狂人:fopen是clib对CreateFile的C语言封装了
2010-08-25 08:52
回复
Coding狂人
Coding狂人我了个去 这是什么效率啊FILE *fp;fp=fopen("FilePath","r");if(fopen==NULL){ MessageBox(NULL,"文件不存在","提示",MB_OK);}
2010-08-24 17:23
回复
匿名网友
匿名网友CreateFile方法不好!

原创粉丝点击