You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:13:27