C#技术问询:如何仅将文件首行生成为StreamContent发送
当然可以实现只发送文件首行作为StreamContent!你的当前代码会发送整个文件流,我们只需要先提取出文件的首行,再把它转换成适合的流来创建StreamContent就行。
核心思路
直接使用原始文件流会读取全部内容,所以我们需要:
- 先读取文件的第一行文本
- 将这行文本转换成内存流(
MemoryStream),因为StreamContent需要接收流类型的参数 - 用这个内存流创建
StreamContent,再进行后续处理
修改后的完整代码
class Program { static void Main(string[] args) { Get().Wait(); } public static async Task<HttpResponseMessage> Get() { using (var fileStream = new FileStream(@"C:\Files\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var reader = new StreamReader(fileStream)) { // 异步读取文件的第一行(自动忽略末尾的换行符) string firstLine = await reader.ReadLineAsync(); // 将首行文本转换为可被StreamContent使用的内存流 Stream contentStream = new MemoryStream(); if (!string.IsNullOrEmpty(firstLine)) { // 可选:加上Environment.NewLine让写入的文件保留换行格式,不需要可直接去掉 byte[] lineBytes = Encoding.UTF8.GetBytes(firstLine + Environment.NewLine); contentStream.Write(lineBytes, 0, lineBytes.Length); contentStream.Position = 0; // 重置流的读取位置到开头,确保后续能正确读取内容 } var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(contentStream) }; using (FileStream fs = new FileStream(@"C:\Files\test_Copy.txt", FileMode.CreateNew, FileAccess.Write)) { await result.Content.CopyToAsync(fs); } return result; } } }
关键细节说明
StreamReader.ReadLineAsync():专门用于读取文本流的一行,会自动处理不同系统的换行符(\r\n或\n),返回的字符串不包含末尾的换行符MemoryStream:作为内存中的临时流,用来承载首行文本的字节数据,满足StreamContent的参数要求- 重置流位置:写完字节数据后必须将
Position设为0,否则后续读取流时会从末尾开始,导致读不到任何内容
这样修改后,服务端生成的test_Copy.txt就只会包含原文件的首行内容了。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

