QDir::mkPath 和权限

3
我正在使用Ubuntu 12.04 LTS和10.04 LTS平台进行工作,使用QDir :: mkPath时出现问题。 我尝试使用mkPath创建路径,例如/john/play/games,然后将文件game.htm复制到/home/john/play。复制文件后,我将文件权限设置为rwxr---,以便第三方应用程序可以读取文件game.htm。但目录/john,/john/play和/john/play/games的权限是drwxr-x--,因此其他应用程序和其他用户无法读取文件game.htm。
我还观察到,在另一个应用程序中,相同的QDir :: mkpath创建的目录具有drwxr-xr-x权限。我想了解QDir :: mkpath创建目录的权限,并如何控制或设置权限。

1
你的问题实际上是与编程无关的,因为它与UNIX相关。你需要详细了解UNIX中文件和目录权限是如何工作的。此外,你不应该把全局可见的文件放在用户目录中,而应该把它们放在/usr/share/或者其他正确的位置。 - sashoalm
1
@satuon,我更关心qt的QDir :: mkpath如何工作以及如何使其正常工作。而我所说的路径只是举个例子。 - sky
QDir::mkpath 通过调用操作系统提供的 API 来工作。它的工作方式与从 shell 调用 mkdir -p 相同。它完全依赖于操作系统。你读了我给你的链接吗? - sashoalm
@satuon,我已经仔细阅读了整个文档,学到了很多东西,但是对于QDir::mkpath这个问题并没有帮助。我不确定你在那篇文档中指向了什么。可能是我的问题误导了你。简而言之,我该如何使用QDir::mkpath,以便由QDir::mkpath创建的所有目录都具有组和其他人的r-x权限?如果QDir::mkpath无法实现,则是否有任何解决方法来实现此目的?目前,我遍历路径中的所有目录,在每个目录上创建一个QFile,然后使用QFile::setPermissions()设置权限,这似乎有点愚蠢。 - sky
你不能使用QDir::mkpath来实现,因为它需要跨平台。想一想,它需要在Windows上工作,这里甚至没有执行权限,也需要在塞班系统上工作。它只能做到最小公分母。换句话说,它总是使用给定操作系统的默认权限。调整它们的唯一方法是使用UNIX特定的API,顺便说一下,你可以这样做。 - sashoalm
1个回答

2

正如sky在评论中完美指出的那样,让mkdir例程创建可读目录的环境混乱。

但是,在调用QDir::mkpath之前,您可以使用umask()操作系统函数将umask设置为其他值。不过,在Windows上,您可能需要使用#ifdef将其排除在外,尽管我怀疑umask()函数可能已经在qtcreator在wnidows上使用的mingw环境中实现了。所以它可能仍然有效。


谢谢Wes。那似乎是唯一的方法。 - sky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接