• 9892阅读
  • 13回复

如何判断目录中是否可以创建子目录 [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 倒序阅读 楼主  发表于: 2010-06-28
— 本帖被 XChinux 执行加亮操作(2010-09-02) —
环境:Vista, VC2008, QT4.5.3
尝试判断是否可以在一个目录下创建子目录,过程如下:
在一个QFileInfo中给定一个目录(例如"C:\\Program Files"),用isWritable判断是否可写,分别以普通用户和管理员用户运行该程序,均返回false,奇怪的是,当我用QDir的mkpath在该目录下创建一个子目录的时候,用管理员的权限是可以成功的,问题是为什么isWritable在管理员用户权限下返回的是false呢? 有什么方法先判断一下在该目录下是否能够创建子目录吗?当然最好是不要用尝试的方法调用mkpath了。
windows 7 + VC++2008 + Qt4.5.2
离线water_wf

只看该作者 1楼 发表于: 2010-06-29
这个是判断文件是否可写吧,是不是应该用QDir或者别的QUrlInfo,建议下
离线sbtree
只看该作者 2楼 发表于: 2010-06-29
回楼上,QDir只发现一个isReadable的函数,没有isWritable,另外帮助中明确说了QFileInfo是适用于文件路径的

QFileInfo provides information about a file's name and position (path) in the file system, its access rights and whether it is a directory or symbolic link, etc. The file's size and last modified/read times are also available. QFileInfo can also be used to obtain information about a Qt resource.
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 3楼 发表于: 2010-06-30
是不是我的问题描述的过于清楚了?几乎无人问津。谢谢water_wf捧场
windows 7 + VC++2008 + Qt4.5.2
离线water_wf

只看该作者 4楼 发表于: 2010-07-01
呵,刚做了个简单测试,在Linux应该正常的
离线sbtree
只看该作者 5楼 发表于: 2010-07-01
引用第4楼water_wf于2010-07-01 08:59发表的  :
呵,刚做了个简单测试,在Linux应该正常的

不知道这个问题是不是Qt对UAC兼容性未考虑周全的原因
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 6楼 发表于: 2010-07-19
期待理想的解决方法。。。
windows 7 + VC++2008 + Qt4.5.2
离线steinlee

只看该作者 7楼 发表于: 2010-07-21
If you do need to create a sub-dir, simply call mkdir(). If it succeeds, it returns true and this means that it is writable; otherwise, not writable.
You do not need to check it first.
Looking for remote C/C++ and Qt 兼职
离线sbtree
只看该作者 8楼 发表于: 2010-07-21
引用第7楼steinlee于2010-07-21 03:43发表的  :
If you do need to create a sub-dir, simply call mkdir(). If it succeeds, it returns true and this means that it is writable; otherwise, not writable.
You do not need to check it first.

我在开贴的时候就说了不要用这种尝试的方法了。我的目的不是要单纯的创建一个目录,或者用这种尝试方法创建一个临时目录,再删除它,由创建成功与否的返回值来判断该目录是否可写。这种方法不是最理想的,因为在某些情况下是不允许先尝试性的创建一个目录的。一个比较合理并且完善的方法不是这样实现的,而应该从该目录的属性或读写权限方面寻求解决办法。技巧只能在某些特定的情况下应用,不能作为一种算法或理论去应用。
windows 7 + VC++2008 + Qt4.5.2
离线dbzhang800

只看该作者 9楼 发表于: 2010-07-21
引用第8楼sbtree于2010-07-21 05:47发表的  :
我在开贴的时候就说了不要用这种尝试的方法了。我的目的不是要单纯的创建一个目录,或者用这种尝试方法创建一个临时目录,再删除它,由创建成功与否的返回值来判断该目录是否可写。这种方法不是最理想的,因为在某些情况下是不允许先尝试性的创建一个目录的。一个比较合理并且完善的方法不是这样实现的,而应该从该目录的属性或读写权限方面寻求解决办法。技巧只能在某些特定的情况下应用,不能作为一种算法或理论去应用。

个人觉得这种问题没必要这么盯着Qt吧,完全可以看看C++或C中有没有方法,或者直接使用 win api
离线XChinux

只看该作者 10楼 发表于: 2010-07-21
如果是在win下,建议使用win32 API来判断。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线sbtree
只看该作者 11楼 发表于: 2010-07-21
自从Vista加入了UAC功能以后,判断就不是那么简单了,即使使用win api。而我这个要求实际上是很简单的,只是isWritable这个函数让我失望了,或许新版的Qt在Win下能改进。其实我也只是想偷点懒,想利用利用现成的而已。
windows 7 + VC++2008 + Qt4.5.2
离线water_wf

只看该作者 12楼 发表于: 2010-08-24
离线sbtree
只看该作者 13楼 发表于: 2010-08-24
water_wf,谢谢你的链接,我回头再试一试,不过那个帖子还没有楼主的结论呢,我目前的解决方法是直接采用了Windows API来判断的,不能跨平台了,呵呵
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个