升级VS2022与.NET8后Stream转文件/FTP上传出现0字节异常
解决Stream保存/上传后文件为0字节的问题
问题根源
调用encoder.Save(stream)完成写入后,MemoryStream的Position指针会停留在流的末尾。此时直接用该流执行上传、复制等读取操作时,会从末尾位置开始读取,自然获取不到任何数据,最终生成0字节文件。
修复方案
在使用流执行读取/上传/复制操作前,必须将流的Position重置为0(或调用stream.Seek(0, SeekOrigin.Begin)),让读取指针回到流的起始位置。
对应代码修改示例
- 原FTP上传代码修复:
var bitmap = AlbumCover0.Source as BitmapSource; var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); var stream = new MemoryStream(); encoder.Save(stream); stream.Position = 0; // 关键:保存后重置指针到流的开头 SessionOptions sessionOptions = FTP.Login(); using Session session = new(); session.Open(sessionOptions); session.PutFile(stream, "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png");
- 转byte[]后上传的代码修复:
var bitmap = AlbumCover0.Source as BitmapSource; // ... 省略encoder初始化代码 encoder.Save(stream); byte[] bytes = stream.ToArray(); // ToArray()会读取整个流,不受Position影响 stream.Position = 0; // 上传前必须重置指针 SessionOptions sessionOptions = FTP.Login(); // ... 省略session初始化代码 session.PutFile(stream, "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png");
- 保存本地文件的代码修复:
var bitmap = AlbumCover0.Source as BitmapSource; // ... 省略encoder初始化代码 encoder.Save(stream); stream.Position = 0; // 复制到FileStream前重置指针 using (FileStream file = new FileStream("C:\\test.png", FileMode.Create)) { stream.CopyTo(file); } session.DoPutFiles("C:\\test.png", "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png", false, new TransferOptions() { TransferMode = TransferMode.Binary });
补充说明
在.NET的Stream操作逻辑中,所有写入操作完成后,Position都会自动指向写入内容的末尾。后续的读取、复制、上传等操作默认从当前Position开始,因此必须手动重置Position到起始位置,才能正确读取到之前写入的全部内容。
内容的提问来源于stack exchange,提问作者RoseTeq
相关产品推荐
相关产品推荐

