0

我正在使用以下代码来确定是否可以使用 QFileInfo 写入特定目录:

QFileInfo dinfo(dirname);
if (dinfo.exists())
  valid = dinfo.isWritable()

不幸的是,当我在 Vista 64 上传入当前用户桌面的路径时:

C:\Users\USERNAME\Desktop

QFileInfo::isWritable() 返回 false。但是,如果我将它传递给另一个目录(比如 C:\Temp),它会返回 true。我从 QFileInfo 对象请求目录权限,该对象为 5555(任何人都不可写)。此代码在包括 Windows XP 在内的其他平台上按预期工作。任何人都对这里可能发生的事情有任何想法。

作为参考,如果我删除检查,我实际上可以毫无问题地将文件保存到该位置。

4

3 回答 3

3

因此,在对 Qt 的 Task Tracker 进行了一些研究之后,我发现 QFileInfo::isWritable() 仅对文件有效,对目录无效。通过更改代码来询问我是否可以创建感兴趣的文件而不是询问目录是否可写,我能够达到预期的结果:

QDir dir(dirname);
if (dir.exists())
{
  QFileInfo finfo(dir.absoluteFilePath(fname));
  valid = finfo.isWritable();
} 

谢谢。

于 2009-07-07T21:19:56.083 回答
0

我在这里做了一个非常疯狂的猜测,但是您是否检查过它是否是链接、快捷方式、别名或其他伪文件夹?在我看来,您可能获得的是不可写的硬编码符号链接的权限,而不是它所指向的项目的权限。

isSymLink()文档(我添加的粗体):

在 Unix(包括 Mac OS X)上,打开符号链接会有效地打开链接的目标。在 Windows 上,它会打开 .lnk 文件本身。

所以我会检查 的结果isSymLink(),并在必要时从中获取真正的目标symLinkTarget()(并查看最后的文档;目标可能实际存在也可能不存在)。

于 2009-07-07T01:36:46.343 回答
0

在 Windows Vista 上,目录“C:\Users\USERNAME\Desktop”默认为只读。这并不意味着您不能将文件写入该文件夹。这意味着您不能调整目录本身(名称更改等)。

于 2009-07-07T08:04:37.757 回答