如何使用pyCurl批量删除WebDAV目录下的所有文件?
使用pyCurl批量删除WebDAV目录文件的解决方案
一、获取WebDAV目录下的文件列表
WebDAV标准支持PROPFIND方法查询目录内容,我们可以通过发送该请求并解析返回的XML响应提取文件列表,实现代码如下:
import pycurl from io import BytesIO import xml.etree.ElementTree as ET def get_webdav_file_list(url, upload_user, upload_pw): buffer = BytesIO() c = pycurl.Curl() c.setopt(pycurl.URL, url) c.setopt(pycurl.CUSTOMREQUEST, "PROPFIND") # 设置Depth为1,仅查询当前目录(不递归子目录) c.setopt(pycurl.HTTPHEADER, ["Depth: 1"]) # 沿用原有代码的SSL验证配置 c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYHOST, 0) c.setopt(pycurl.USERPWD, f"{upload_user}:{upload_pw}") c.setopt(pycurl.WRITEDATA, buffer) c.perform() c.close() # 解析XML响应提取文件名 response = buffer.getvalue().decode('utf-8') root = ET.fromstring(response) ns = {'d': 'DAV:'} file_list = [] for response_prop in root.findall('.//d:response', ns): href = response_prop.find('d:href', ns).text # 过滤目录本身和子目录,仅保留文件 if href != url and not href.endswith('/'): filename = href.split('/')[-1] file_list.append(filename) return file_list
二、批量删除的优化:复用Curl连接降低负载
标准WebDAV不支持单条请求删除多个文件,但可以通过复用Curl连接(HTTP持久连接)减少重复建立连接的开销,从而降低服务器负载。基于你原有代码改造的批量删除函数如下:
def batch_delete_files(url, file_list, upload_user, upload_pw): c = pycurl.Curl() # 提前设置通用选项,避免重复配置 c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYHOST, 0) c.setopt(pycurl.USERPWD, f"{upload_user}:{upload_pw}") c.setopt(pycurl.CUSTOMREQUEST, "DELETE") for filename in file_list: file_url = f"{url}{filename}" c.setopt(pycurl.URL, file_url) c.perform() c.close()
完整使用示例
# 配置WebDAV信息 webdav_dir_url = "https://your-webdav-server.com/target-directory/" user = "your-username" pw = "your-password" # 获取文件列表并批量删除 file_list = get_webdav_file_list(webdav_dir_url, user, pw) if file_list: batch_delete_files(webdav_dir_url, file_list, user, pw) print(f"成功删除{len(file_list)}个文件") else: print("目标目录下无文件可删除")
补充说明
- 若需要递归删除子目录及文件,可将
PROPFIND请求的Depth设为infinity,并在解析时处理子目录,递归调用删除函数。 - 关闭SSL验证存在安全风险,生产环境建议开启验证并配置正确的CA证书。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

