Python客户端向C#服务端传文件遇保存失败、流程卡住问题排查
问题根因与修复方案
无法保存到指定文件夹的原因
- 代码中提前定义了目标存储路径变量
folder,也拼接了full_path作为返回值,但实际初始化FileStream时,没有使用这个完整路径,反而用Path.GetFileName(cmdFileName)作为文件路径。这种写法会让文件直接保存到程序运行的当前工作目录(通常是可执行文件所在的bin/Debug或bin/Release文件夹),根本不会写入你预先指定的桌面目标文件夹。
传输流程中途阻塞的原因
- 踩了网络流跨读取方式的经典缓冲坑:
StreamReader初始化时会预读网络流的数据到自身内部缓冲区,你用reader.ReadLine()读取文件大小、文件名两行文本时,StreamReader很可能一次性把后续传输的文件二进制数据也读进了缓冲区。 - 后续代码直接通过
tcpClient.GetStream().Read()读取文件字节时,那部分已经被StreamReader缓存的二进制数据不在原始网络流中,程序会一直等待网络流返回新数据,最终造成流程卡住。
修复步骤
1. 修正文件保存路径
把FileStream的初始化路径改为提前拼接好的完整路径,替换原有错误的路径逻辑:
// 直接使用提前拼接的完整路径,不再单独取文件名 using (FileStream fStream = new FileStream(full_path, FileMode.Create)) { fStream.Write(buffer, 0, buffer.Length); fStream.Flush(); }
2. 解决StreamReader缓冲冲突
两种方案二选一即可:
- 完全抛弃
StreamReader,手动从网络流中按换行符分隔读取文件大小、文件名信息,再直接读取二进制文件内容,从根源上避免缓冲冲突。 - 若保留
StreamReader,不要直接读取原始网络流,所有读取操作都通过StreamReader的基础流配合其内部缓冲完成,或初始化StreamReader时关闭预缓冲,确保读取文本行时不会多取后续的二进制文件数据。
额外提示:当前代码一次性分配和文件总大小等大的字节数组接收内容,大文件场景下会占用大量内存,后续可以优化为边接收边分块写入文件的逻辑,降低内存占用。
内容的提问来源于stack exchange,提问作者user14368706
相关产品推荐
相关产品推荐

