使用通道将字节切片写入文件无法正确打开文件

时间:2017-05-04 08:50:15

标签: file go udp

嗨,我使用udp协议(必须使用它)传输文件,接收字节流时遇到问题并写入文件。
 如下图所示:

  type FileInfo struct {  
      Flen int64  
      Fname [24]byte
  }  
  type Datapackage struct {  
       NContent [1000]byte  
       Finfo    FileInfo  
       Datatype  byte  
       NContentLen int64
  }
  func main(){

  var dp Datapackage
  var recvChan = make(chan []byte)  
  var  buf :=new(bytes.Buffer)  
  p :=make([]byte, 1041) // 1041 is receive package len

  ser, _ := net.ListentenUDP("udp", &addr)
  for {  
      _ ,err := ser.Read(p)  
      buf.Write(p)  
      binary.Read(buf, binary.BigEndian, &dp)
      if dp.Datatype =='A'{   
          filenamelen := bytes.IndexByte(dp.Finfo.Fname[:], 0)  
          filename := string(dp.Finfo.Fname[:filenamelen]) 
          fp, err := os.Create(filename)
          if  err != nil {  
               fmt.Println(err)
          }  
          go func(fp *os.File){  
             for {  
                 wn, err := fp.Write(<-recvChan)
                 if err != nil {
                    fmt.Println(err)  
                 }
                 if wn < 1000{
                    fmt.Println(wn)
                    break
                 }
             }(fp)
             close(recvChan)
             fp.Close()
          }

      } else{
          recvChan<-dp.NContent[:dp.NContentLen] 
      }

     // }else{
     //      wn, err = fp.Write(dp.NContent[:dp.NContentLen])  
     //      if  err != nil { 
     //          fmt.Println(err)
     //      }
     //     if wn < 1000{  
     //            fp.Close()
     //           continue
     //     }
     //}


  }  
}  

现在如上所述,有两种方法可以将数据流写入文件,一种是通常的方式,即Annotations,另一种是使用通道。但是当使用频道时,获取文件的大小是否严格,但无法打开(例如exe,zip)正确,如果不使用频道,文件可以打开正确,我不知道为什么?
  任何帮助将不胜感激。

0 个答案:

没有答案