python 获得 windows 系统里文件/文件夹的所有者

本文介绍如何使用Python的pywin32模块获取Windows系统上文件和文件夹的所有者信息。通过示例代码展示了如何安装所需模块并调用相关API来获取指定文件或文件夹的所有者名称及所属域。

先安装 python3.5, 再安装 pywin32-227.win32-py3.5.exe (对应32位 python)或 pywin32-227.win-amd64-py3.5.exe(对应64位 python)

获得文件的所有者:

import win32api
import win32con
import win32security

# 获得登陆用户的名字
print "I am", win32api.GetUserNameEx(win32con.NameSamCompatible)


FILENAME = "temp.txt"
open(FILENAME, "r").close()  # 这里要写 "r",不能写 "w"

sd = win32security.GetFileSecurity(FILENAME, win32security.OWNER_SECURITY_INFORMATION)
owner_sid = sd.GetSecurityDescriptorOwner()
name, domain, type = win32security.LookupAccountSid(None, owner_sid)

print "File owned by %s\\%s" % (domain, name)

打印结果:

I am 当前登陆用户名\当前登陆用户名
File owned by 文件的所有者所属的域\文件的所有者的用户名

获取文件夹的所有者:

import win32api
import win32con
import win32security

FILENAME = "d:\\test"

sd = win32security.GetFileSecurity(FILENAME, win32security.OWNER_SECURITY_INFORMATION)
owner_sid = sd.GetSecurityDescriptorOwner()
name, domain, type = win32security.LookupAccountSid(None, owner_sid)

print "Dir owned by %s\\%s" % (domain, name)

打印结果:
Dir owned by 文件夹的所有者所属的域\文件夹的所有者的用户名

-----------------------------------------------------------------------------

其他参考:

各个版本 pywin32 的下载地址:   https://github.com/mhammond/pywin32/releases

解决在Python中使用Win32api报错的问题,No module named win32api: 解决在Python中使用Win32api报错的问题,No module named win32api - 天道酬勤2016 - 博客园

这段 python 程序的英语说明: Tim Golden's Python Stuff: Get the owner of a file

<think>根据用户问题,我们需要实现删除文件夹下所有文件文件夹的功能。参考提供的引用内容,我们可以综合几种方法。 主要思路: 1. 遍历目标目录下的所有文件和子文件夹。 2. 对于每个文件,使用os.remove()删除。 3. 对于每个子文件夹,由于可能非空,我们可以使用shutil.rmtree()来删除整个目录树(包括面的所有文件和子文件夹)。 但是注意:如果使用os.walk()来遍历并删除,需要自底向上删除(即先删除文件再删除空目录),或者直接使用shutil.rmtree()删除整个目录,然后再重新创建空目录(如果用户需要保留这个空目录的话)。 根据用户需求,如果我们只是要清空文件夹(保留该文件夹本身),那么我们可以: - 删除该文件夹下的所有内容(文件和子文件夹) - 但不删除该文件夹 引用[1]中的函数deletDir就是实现这个功能的: def deletDir(deletDirPath): del_list = os.listdir(deletDirPath) for f in del_list: file_path = os.path.join(deletDirPath, f) if os.path.isfile(file_path): os.remove(file_path) elif os.path.isdir(file_path): shutil.rmtree(file_path) 但是注意:这种方法对于嵌套的文件夹,使用shutil.rmtree()可以直接删除整个子文件夹(包括面的所有内容),所以可以一次清空。 另一种方法是使用shutil.rmtree()删除整个目录,然后再创建一个同名的空目录(如引用[3]中的部分代码所示)。但是这样会丢失原文件夹的权限等信息,如果不需要保留原文件夹的元数据,这种方法也可以。 因此,我们提供两种方法: 方法1:遍历目录,逐个删除文件和子文件夹(使用os.remove和shutil.rmtree) 方法2:删除整个目录再重建(这样会丢失原目录的元数据,但更简单) 根据用户需求,如果只是清空目录内容而保留目录本身,两种方法都可以,但方法1可以保留原目录的元数据(如创建时间、权限等),而方法2会重新创建目录,所以元数据会重置。 我们根据引用内容,给出两种实现,并说明适用场景。 代码实现: 方法1(推荐,保留原目录元数据): import os import shutil def clear_dir(dir_path): for filename in os.listdir(dir_path): file_path = os.path.join(dir_path, filename) if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) # 删除文件或符号链接 else: shutil.rmtree(file_path) # 删除子文件夹 方法2(删除整个目录再重建): import os import shutil def clear_dir(dir_path): shutil.rmtree(dir_path) # 删除整个目录 os.makedirs(dir_path) # 重新创建空目录 注意:方法2会删除原目录并新建,所以原目录的权限、所有者等信息可能会改变(除非在os.makedirs时指定),而且如果其他程序正在使用该目录可能会出错。 因此,一般情况下,如果只是清空目录内容,推荐使用方法1。 但是,方法1有一个小问题:如果目录下有符号链接,我们使用os.unlink来删除(不会删除链接指向的原始文件或目录)。而方法2会删除整个目录,包括面的符号链接(但不会删除链接指向的内容)。 另外,引用[2]中提到,删除文件可以用os.remove或os.unlink,两者功能相同。 我们还可以使用os.walk来遍历删除,但需要自底向上删除目录(使用topdown=False),这样先删除最深层的文件,再删除上层目录。但是这样写起来稍微复杂一些,而且使用shutil.rmtree已经可以删除非空目录,所以我们不需要递归删除每个子目录。 因此,我们采用方法1。 但是注意:如果目录下存在大量的文件和子目录,方法1可能效率较低(因为每个子目录都调用一次shutil.rmtree,而shutil.rmtree本身是递归的)。不过对于清空一个目录来说,两种方法在效率上差别不大。 我们给用户提供一个完整的函数,并添加一些错误处理(例如目录不存在的情况)。 代码实现(方法1的增强版): import os import shutil def clear_directory(dir_path): # 确保目录存在 if not os.path.exists(dir_path): print(f"目录 '{dir_path}' 不存在") return # 遍历目录 for filename in os.listdir(dir_path): file_path = os.path.join(dir_path, filename) try: if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) # 删除文件或符号链接 else: shutil.rmtree(file_path) # 删除子目录(非空也可以) except Exception as e: print(f"删除 {file_path} 失败,原因: {e}") 如果用户希望删除目录本身,那么直接使用shutil.rmtree(dir_path)即可。 根据用户问题,他需要删除文件夹下所有文件文件夹,即清空该文件夹,所以我们保留该文件夹本身。 因此,我们推荐使用上述clear_directory函数。 另外,引用[3]中有一个例子是删除文件文件夹的,也使用了os.remove和shutil.rmtree,与我们的方法一致。 最后,我们还需要注意:在Windows系统中,如果文件是只读的,删除可能会失败。我们可以处理权限问题,但这为了简单,先不考虑。 下面我们按照要求生成回答。 </think> ### Python3删除文件夹下所有文件文件夹的实现方法 在Python3中删除目录及其所有内容(文件和子文件夹)主要有两种常用方法,下面我将详细说明实现步骤: #### 方法1:使用`os`和`shutil`模块(推荐) ```python import os import shutil def clear_directory(directory_path): """ 删除目录下所有文件和子文件夹(保留父目录) 参数: directory_path: 要清空的目录路径 """ # 检查目录是否存在 if not os.path.exists(directory_path): return # 遍历目录内容 for item in os.listdir(directory_path): item_path = os.path.join(directory_path, item) if os.path.isfile(item_path) or os.path.islink(item_path): os.remove(item_path) # 删除文件或链接 else: shutil.rmtree(item_path) # 递归删除子文件夹及其内容 ``` **使用示例**: ```python clear_directory(r'C:\temp\my_folder') # 清空my_folder但保留空目录 ``` #### 方法2:直接删除整个目录后重建 ```python import os import shutil def recreate_directory(directory_path): """ 完全删除目录后重建空目录 参数: directory_path: 要重建的目录路径 """ if os.path.exists(directory_path): shutil.rmtree(directory_path) # 递归删除整个目录 os.makedirs(directory_path) # 创建空目录 ``` **使用示例**: ```python recreate_directory(r'C:\temp\my_folder') # 得到全新的空目录 ``` ### 关键函数说明 1. **`os.listdir(path)`** 列出目录中的所有文件和子目录[^1] 2. **`os.remove(path)`** 删除单个文件(不能删除目录)[^2] 3. **`shutil.rmtree(path)`** 递归删除整个目录树(包含所有子目录和文件)[^3] 4. **`os.path.join()`** 安全拼接路径(处理不同操作系统的路径分隔符) 5. **`os.path.exists()`** 检查路径是否存在[^1] ### 注意事项 1. 删除操作不可逆,建议先备份重要数据 2. Windows系统下删除正在使用的文件会引发`PermissionError` 3. 使用绝对路径比相对路径更安全 4. 删除系统目录需要管理员权限 5. `shutil.rmtree()`会直接删除整个目录结构[^3] ### 文件类型处理 - 普通文件:`os.remove()` - 符号链接:`os.unlink()`[^2] - 空目录:`os.rmdir()` - 非空目录:`shutil.rmtree()`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值