ling592
驱动牛犊
驱动牛犊
  • 注册日期2007-04-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
阅读:2230回复:6

请教:怎么判断文件是否存在

楼主#
更多 发布于:2007-05-16 17:04
想在打开一个文件时,判断指定的目录下是否存在这个文件,若不存在则重定向到另一个目录去打开
怎么判断指定目录下是不是存在这个文件?通过判断哪个返回值?
若不存在,能不能替换FILE_OBJECT中的FileName,然后返回IO_REPARSE这样来重定向

谢谢!
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2007-05-16 17:29
1. 判断文件是否存在:(重用Create的IRP)Open文件然后判断IRP中的
                                        IoStatus.Information是否为FILE_EXISTS;
2. 如果需要重定向简单的替换FILE_OBJECT中的FileName存在问题,
    因为文件名由RelatedFileObject、FileName和irpSp->Flags共同决定
人总在矛盾中徘徊。。。
ling592
驱动牛犊
驱动牛犊
  • 注册日期2007-04-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-17 14:32
十分感谢devia 的指点!
我还想问一下,在SfCreate中,应该在什么时候判断 IoStatus.Information 是否是FILE_EXISTS,要在等待完成例程之后吗?
谢谢!
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-05-18 17:31
感觉逻辑上面有问题
“如果不存在这个文件,就重定向“如果不存在这个文件就不会有关于这个文件的irp传入,也就没办法重定向了。系统判断一个文件是否存在应该IRP_MJ_DIRECTORY_CONTROL的时候处理,所以你这个时候解决应该比较好一点
ling592
驱动牛犊
驱动牛犊
  • 注册日期2007-04-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-05 15:27
我在完成事件之后打印IoStatus.Information出来,
若是成功打开,返回的是FILE_OPENED,
若是试图打开一个不存在的文件,返回的是FILE_SUPERSEDED
都不是FILE_EXISTS或FILE_DO_NOT_EXIST   ,没法判断文件是否存在????

devia大侠说的重用create的IRP是什么意思?
我就是在sfcreate完成之后判断的,是不是不对?

谢谢阿!
ling592
驱动牛犊
驱动牛犊
  • 注册日期2007-04-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-06 13:36
帮帮忙,指点一下吧
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2007-06-07 17:27
如果不是以CREATE_NEW的方式打开,在IoCallDriver之后会返回状态:STATUS_OBJECT_NAME_COLLISION.
要重解析文件名,需要修改FileObject,并返回REPARSE.
商务MSN:YanDong_8212@163.com
游客

返回顶部