Go语言TCP服务器无法写入文件求助(已创建文件)
解决Go TCP服务器无法写入output.txt的问题
嘿,我来帮你搞定这个写文件的小问题!结合你给出的代码片段,咱们一步步排查:
先盯紧文件名和路径
你代码里的ioutil.WriteFile看起来写到一半截断成"ou..."了,首先得确保文件名是完整的"output.txt"。另外要注意程序运行的工作目录——有时候你以为文件会生成在代码所在文件夹,但实际可能跑到了终端当前的工作目录里,找不到文件的话可以先全局搜一下output.txt的位置确认。必须补上错误处理!
你现在的代码里,conn.Read的错误只打印不返回,ioutil.WriteFile更是完全没处理错误,这就像开车不看仪表盘,出问题了都不知道为啥。给你改了下代码,加上关键的错误处理和连接关闭:func handleRequest(conn net.Conn) { defer conn.Close() // 用完连接记得关掉,好习惯! buf := make([]byte, 1024) size, err := conn.Read(buf) if err != nil { fmt.Println("读取数据出错:", err.Error()) return // 读错了就别往下走了,避免白忙活 } s := string(buf[:size]) fmt.Println("收到客户端数据:", s) // 确保文件名是完整的output.txt err = ioutil.WriteFile("output.txt", []byte(s), 0644) if err != nil { fmt.Println("写入文件出错:", err.Error()) return } fmt.Println("数据成功写入output.txt啦!") }加上
WriteFile的错误打印后,就能直接看到问题根源——比如权限不够、磁盘满了、路径不存在之类的。确认数据真的被读进来了
conn.Read一次最多读1024字节,如果客户端发的内容超过这个大小,或者网络原因只读到了空数据,那写进文件的内容自然是空的。可以改成循环读取,确保把客户端发的所有数据都收齐:func handleRequest(conn net.Conn) { defer conn.Close() var data []byte buf := make([]byte, 1024) for { n, err := conn.Read(buf) if err != nil { if err != io.EOF { fmt.Println("读取数据出错:", err) } break } data = append(data, buf[:n]...) } s := string(data) fmt.Println("收到完整数据:", s) err := ioutil.WriteFile("output.txt", []byte(s), 0644) if err != nil { fmt.Println("写入文件出错:", err.Error()) return } }检查文件权限
你设置的文件权限是0644,要确保运行程序的用户有写入当前目录的权限。比如在Linux/macOS上,如果是系统目录,普通用户可能没权限,可以试试用sudo运行程序;Windows的话,检查一下文件夹是不是被设成了只读模式。
内容的提问来源于stack exchange,提问作者Ilya Savitsky
相关产品推荐
相关产品推荐

