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
相关产品推荐
相关产品推荐

