如何检查是否可以在MS XP / Vista的给定目录内创build一个文件?

我有一个代码在用户指定的目录中创build文件。 用户可以指向一个他不能创build文件的目录,但是他可以重命名它。

为了testing目的我创build了目录,我们称之为C:\foo

我有以下权限C:\foo

  • 遍历目录/执行文件
  • 删除子文件夹和文件
  • 删除
  • 读取权限
  • 更改权限
  • 取得所有权

我没有任何以下权限C:\foo

  • 完全控制
  • 文件创build
  • 文件夹创build

到目前为止,我尝试了以下方法:


os.access('C:\foo', os.W_OK) == True

st = os.stat('C:\ foo')
mode = st [stat.ST_MODE]
mode&stat.S_IWRITE == True

我相信这是由于我可以重命名文件夹,所以对我来说是可以改变的。 但它的内容 – 不是。

有谁知道如何编写代码来检查给定的目录,如果当前用户有权限在该目录中创build文件?

简而言之 – 我想检查当前用户是否具有给定文件夹名称的文件创build文件夹创build权限。

编辑:从“Windows Vistaauthentication”程序的testing案例3号产生这样的代码的需要,其中说:

  1. 应用程序不得允许最低特权用户将任何文件保存到Windows系统目录以通过此testing用例。

这应该理解为“应​​用程序可能尝试在Windows系统目录中保存文件,但不应该崩溃失败? 或者说'应用程序在尝试保存文件之前必须执行安全检查?

我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?

我最近编写了一个应用程序来通过一套测试,以获得来自微软的ISV身份,我也添加了这种情况。 我理解的方式是,如果用户是最低优先权,那么他将无权写入系统文件夹。 于是我按照伊希迈尔的描述来解决这个问题。 我尝试创建文件并捕获异常,然后通知用户他没有将文件写入该目录的权限。

在我的理解中,最低特权用户将不具有写入这些文件夹的必要权限,如果他有,那么他不是一个最低限度Priveledge用户。

我是否应该停止打扰,因为Windows Vista本身不会允许最低特权用户保存%WINDIR%中的任何文件?

我的想法是? 是。

我不会浪费时间和LOC来检查权限。 Windows中文件创建的最终测试就是创建本身。 其他因素可能会发挥作用(例如现有文件(或更糟糕的是,文件夹)具有相同的名称,磁盘空间和后台进程。这些条件甚至可以在进行初始检查的时间和实际尝试创建文件。

所以,如果我有这样一个场景,我只是设计我的方法不会失去任何数据的情况下,继续尝试创建我的文件,并为用户提供一个选项来更改选定的目录,然后再试一次如果创建失败。

我同意其他答案,做到这一点的方法是尝试创建文件并捕获异常。

不过 ,在Vista上要小心UAC! 例如,请参阅“为什么我的应用程序允许我将文件保存到Vista中的Windows和System32文件夹? :为了支持旧的应用程序,Vista会“假装”创建文件,而实际上它会在当前用户的配置文件下的所谓的虚拟存储库中创建。

为了避免这种情况,您必须通过在.exe的清单中包含相应的命令来具体告诉Vista您不需要管理权限,请参阅上面链接的问题。

 import os import tempfile def can_create_file(folder_path): try: tempfile.TemporaryFile(dir=folder_path) return True except OSError: return False def can_create_folder(folder_path): try: name = tempfile.mkdtemp(dir=folder_path) os.rmdir(name) return True except OSError: return False