我正在使用tkinter用python3创建一个应用程序。我的应用程序从物理设备收集数据,并需要将其存储在硬盘上。该程序允许用户指定他们想要存储数据的目录。这是通过来自tkinter.filedialog
的askdirectory
完成的。
选择目录后,我需要检查该目录是否“有效”。如果软件具有在指定目录中创建具有任意名称的新目录的权限,则该目录有效。这就是我被卡住的地方。
我在网上读到我可以使用os.access(path, perm)
,并检查path上的权限。以下是在python 3.7.0中使用不具有管理员权限的标准用户的结果示例:
>>> os.access("C:\Program Files\Android", os.W_OK | os.X_OK)
True
>>> os.access("C:\Program Files\kjkjieikjd", os.W_OK | os.X_OK)
False
>>> os.access("C:\Program Files", os.W_OK | os.X_OK)
True
这不是我想要的结果,因为如果给定的目录可以创建或已经存在,则返回True,否则返回False。相反,如果我可以在给定的目录内创建任意目录,我需要它返回True。在上面的示例中,它们都应该返回False,因为标准用户在没有管理员授权的情况下不能在program files
中创建文件夹。
我还读到,我可以尝试创建一个文件夹,并使用os.makedirs
测试异常。这种方法也不起作用,因为任何任意目录都可以包含任意子目录,并且当目录已经存在时,os.makedirs
会引发异常。在这种情况下,我将不得不生成随机的目录名,并等待,直到我成功地创建了文件夹,或者我得到了一个不是FileExistsError
的异常,这不是很好。
这两种方法都依赖于创建特定目录的想法,但在我的示例中,我需要能够创建任意目录。
如何在Python 3.7.0中检查是否有权限在给定路径下创建任意目录?
发布于 2018-08-02 06:09:57
有很多因素(除了目录权限)会阻止您在自定义位置创建文件夹和文件。例如:
中断访问系统目录
诸若此类。还要注意:所有这些因素(包括目录权限)都可能在您成功检查目录之后、实际写入数据之前发生变化。
这就是为什么我强烈建议使用EAFP (“请求原谅比请求许可更容易”)的方法:
Nevertheless,如果您确实需要预先检查目录路径,可以使用tempfile.mkdtemp来测试是否可以在指定路径下创建任何目录:
def validate_path(path):
try:
os.makedirs(path, exist_ok=True)
temp_dir_path = tempfile.mkdtemp(dir=path)
os.rmdir(temp_dir_path)
return True
except OSError:
return False
或者(正如@Martijn提议的那样)使用tempfile.TemporaryDirectory作为上下文管理器的更短的等效变体:
def validate_path(path):
try:
os.makedirs(path, exist_ok=True)
with tempfile.TemporaryDirectory(dir=path):
return True
except OSError:
return False
注1:os.makedirs是必须的,否则如果path
不存在,创建临时目录会失败。
注意2:如果你使用的是PYTHON3.3版本,你应该捕获的不是OSError而是EnvironmentError。
https://stackoverflow.com/questions/51266312
复制相似问题