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

C#使用Minio上传文件后文件被进程占用无法即时删除求助

问题原因与解决方案

核心原因

当使用WithFileName直接传入本地文件路径时,MinIO SDK内部会自动打开文件流进行读取,但部分场景下存在文件流未及时释放的问题,导致文件被进程锁定,无法立即删除。这不是你对异步处理的理解错误,大概率是SDK内部资源管理的小问题。

解决方案

方案1:手动管理文件流(推荐)

自己创建并控制文件流的生命周期,通过using语句确保流在上传完成后立即释放,彻底避免文件锁定问题。修改后的代码如下:

private async static Task Run(MinioClient minio)
{
    var bucketName = "mymusic";
    var objectName = "golden-oldies.zip";
    var filePath = "C:\\Users\\username\\Downloads\\golden_oldies.mp3";
    var contentType = "application/zip";

    try
    {          
        // 使用using包裹FileStream,确保上传完成后自动释放资源
        using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
        
        var putObjectArgs = new PutObjectArgs()
            .WithBucket(bucketName)
            .WithObject(objectName)
            .WithStream(fileStream) // 传入手动创建的流
            .WithContentType(contentType)
            .WithObjectSize(fileStream.Length); // 必须指定文件大小

        await minio.PutObjectAsync(putObjectArgs).ConfigureAwait(false);
        Console.WriteLine($"Successfully uploaded {objectName}");
        
        // 上传完成后立即删除本地文件
        File.Delete(filePath);
        Console.WriteLine("本地文件已成功删除");
    }
    catch (MinioException e)
    {
        Console.WriteLine("文件上传错误: {0}", e.Message);
    }
    catch (IOException ioEx)
    {
        Console.WriteLine("文件删除失败: {0}", ioEx.Message);
    }
}

方案2:升级MinIO SDK到最新稳定版

部分旧版本的MinIO .NET SDK存在资源泄漏的bug,升级到最新版本可能直接解决文件锁定问题。你可以通过NuGet包管理器更新Minio包到最新版本后,再测试原代码是否正常。

补充说明

你的异步处理逻辑是正确的,await minio.PutObjectAsync(...).ConfigureAwait(false)已经确保上传操作完成后才执行后续代码,问题核心不在异步处理上。

内容的提问来源于stack exchange,提问作者lvbartow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:47:50