IT小春子 2024-05-24 17:13 采纳率: 69.6%
浏览 711

minio删除桶可以实现成功删除,为什么删除指定文件或指定目录就不能成功删除呢?

minio删除桶可以实现成功删除,为什么删除指定文件或指定目录就不能成功删除呢?

运行python输出:
File 'dzjz/yxsj/dzjzzz/522700/d9d56b3a2c6b45a79a7e49ea71ee0baf/01e7384be5064c37b425efe180356285/01e7384be5064c37b425efe180356285.jpg' has been deleted.
All objects under folder 'dzjz/yxsj/dzjzzz/522700/d9d56b3a2c6b45a79a7e49ea71ee0baf/' have been deleted.

代码如下:


from minio import Minio
import re
import re
def delete_single_file(minio_client, bucket_name, file_path):
    """
    删除MinIO中指定文件。

    :param minio_client: Minio客户端实例
    :param bucket_name: 存储桶名称
    :param file_path: 文件路径
    """
    try:
        # 执行删除操作
        minio_client.remove_object(bucket_name, file_path)
        print(f"File '{file_path}' has been deleted.")
    except Exception as err:
        print(f"An error occurred: {err}")
def delete_bucket_folder(minio_client, bucket_name, folder_path):
    """
    删除MinIO中指定文件夹及其所有子对象。

    :param minio_client: Minio客户端实例
    :param bucket_name: 存储桶名称
    :param folder_path: 要删除的文件夹路径(以斜杠结尾)
    """
    try:
        # 获取所有匹配路径的对象
        objects = list(minio_client.list_objects(bucket_name, prefix=folder_path, recursive=True))

        # 直接在结果中使用正则表达式匹配
        objects = [obj for obj in objects if re.match(f'^{re.escape(folder_path)}', obj.object_name)]

        print(f"Objects under folder '{folder_path}':")
        if objects:
            print(f"Found {len(objects)} objects to delete under folder '{folder_path}'.")

            # 确认用户是否希望继续删除
            confirm = input("Are you sure you want to delete these objects? (yes/no): ")
            if confirm.lower() != 'yes':
                print("Deletion cancelled.")
                return
            print("All objects:")


            # 执行删除操作
            for obj in objects:
                print(obj.object_name)
                minio_client.remove_object(bucket_name, obj.object_name)
                print(f"Deleted: {obj.object_name}")

            print(f"All objects under folder '{folder_path}' have been deleted.")
        else:
            print(f"No objects found under folder '{folder_path}'.")

    except Exception as err:
        print(f"An error occurred: {err}")

def delete_bucket_folder1(minio_client, bucket_name, folder_path):
    """
    删除MinIO中指定文件夹及其所有子对象。

    :param minio_client: Minio客户端实例
    :param bucket_name: 存储桶名称
    :param folder_path: 要删除的文件夹路径(以斜杠结尾)
    """
    try:
        # 获取所有匹配路径的对象
        objects = list(minio_client.list_objects(bucket_name, prefix=folder_path, recursive=True))

        # 递归删除所有对象
        for obj in objects:
            if obj.is_prefix():
                delete_bucket_folder(minio_client, bucket_name, obj.object_name)
            else:
                minio_client.remove_object(bucket_name, obj.object_name)
                print(f"Deleted: {obj.object_name}")

        print(f"All objects under folder '{folder_path}' have been deleted.")
    except Exception as err:
        print(f"An error occurred: {err}")
def main():
    # 创建MinIO客户端
    minio_client = Minio(
        "192.168.100.67:9000",
        access_key="minioadmin",
        secret_key="minioadmin",
        secure=False
    )
##
##    # 要删除的文件夹路径
##    folder_to_delete = "/yxsj/dzjzzz/"
##
##    # 删除指定路径下的所有对象
##    delete_bucket_folder(minio_client, "dzjz", folder_to_delete)

##    # 要删除的文件路径
##    file_to_delete = "dzjz/yxsj/dzjzzz/522700/d9d56b3a2c6b45a79a7e49ea71ee0baf/01e7384be5064c37b425efe180356285/01e7384be5064c37b425efe180356285.jpg"
##
##    # 删除指定路径的文件
##    delete_single_file(minio_client, "dzjz", file_to_delete)

        # 要删除的文件夹路径
    folder_to_delete = "dzjz/yxsj/dzjzzz/522700/d9d56b3a2c6b45a79a7e49ea71ee0baf/"

    # 删除指定路径的文件夹
    delete_bucket_folder1(minio_client, "dzjz", folder_to_delete)
if __name__ == "__main__":
    main()
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-24 17:13
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和描述,您能够成功删除整个桶,但是无法删除指定的文件或目录。这可能是由于以下几个原因:

    1. 权限问题:确保您的MinIO客户端使用的access_keysecret_key具有足够的权限来删除指定的文件或目录。

    2. 路径问题:在MinIO中,文件和目录的路径是区分大小写的,并且路径中的斜杠/是URL编码的。确保file_pathfolder_path变量中的路径与MinIO中实际的路径完全匹配。

    3. 递归删除逻辑问题:在delete_bucket_folder1函数中,您使用了obj.is_prefix()方法来判断是否为前缀,但是这个方法实际上是用来判断是否为目录的。在MinIO中,删除文件时不需要递归调用,因为文件不是目录。

    4. 错误处理:您的代码中使用了try-except块来捕获异常,但是没有详细打印出异常的具体类型和消息。这可能会隐藏一些有用的调试信息。

    5. 确认删除操作:在delete_bucket_folder函数中,您要求用户确认是否删除,如果用户输入的不是yes,则取消删除。确保在测试时用户输入了正确的确认。

    6. 客户端版本问题:确保您使用的MinIO Python客户端库是最新版本,因为旧版本可能存在一些已知的bug或不支持某些功能。

    为了解决这个问题,您可以尝试以下步骤:

    • 确保您的访问密钥和密钥ID具有删除文件和目录的权限。
    • 检查file_pathfolder_path是否与MinIO中的实际路径完全匹配,包括大小写和URL编码。
    • 移除delete_bucket_folder1函数中的obj.is_prefix()检查,因为它在这里不适用。
    • try-except块中打印出具体的异常类型和消息,以便更好地调试问题。
    • 如果您在delete_bucket_folder函数中使用了用户确认,确保在测试时输入了正确的确认。

    如果您仍然无法解决问题,您可能需要查看MinIO服务器的日志文件,以获取更多关于失败删除操作的信息。此外,您也可以考虑联系MinIO的社区或官方支持以获得帮助。

    由于我没有引用任何外部链接,所以不需要列出引用链接。如果您需要进一步的帮助,请提供更多的错误信息或日志,以便更准确地诊断问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月24日
  • 创建了问题 5月24日