package main import ( "archive/zip" "fmt" "io" "math" "net" "os" "path" "strconv" ) const chunkSize = 1 * 30 << (10 * 2) //const fileName = "putty.exe" const port = 40000 var zipName = "cbd88.zip" func main() { wd, _ := os.Getwd() fmt.Println(wd) srcDir, err := os.OpenFile(wd, os.O_RDONLY, os.ModePerm) defer srcDir.Close() if err != nil { panic(err) } names, err := srcDir.Readdirnames(1000) if err != nil { panic(err) } fmt.Println(names) zipfile, err := os.Create(zipName) if err != nil { panic(err) } defer zipfile.Close() archive := zip.NewWriter(zipfile) for _, name := range names { if name == "." || name == "server.exe" || name == zipName { continue } file, err := os.Open(name) if err != nil { panic(err) } defer file.Close() err = compress(file, "", archive) if err != nil { panic(err) } } archive.Close() srcFile, err := os.OpenFile(zipName, os.O_RDONLY, os.ModePerm) defer srcFile.Close() if err != nil { panic(err) } fileInfo, err := srcFile.Stat() if err != nil { panic(err) } srcSize := fileInfo.Size() srcExt := path.Ext(zipName) num := math.Ceil(float64(srcSize) / chunkSize) //=========================== for i := 1; i <= int(num); i++ { srcFile.Seek(int64((i-1)*chunkSize), 0) buf := make([]byte, chunkSize) if chunkSize > (int(srcSize) - chunkSize*(i-1)) { buf = make([]byte, int(srcSize)-chunkSize*(i-1)) } _, err := srcFile.Read(buf) if err != nil { panic(err) } go startSer(i, &buf) } //=========================== lastChunkSize := srcSize - chunkSize*(int64(num)-1) res := fmt.Sprint(port) + " " + fmt.Sprint(num) + " " + fmt.Sprint(chunkSize) + " " + fmt.Sprint(lastChunkSize) + " " + zipName + " " + srcExt fmt.Println(res) //for i := 1; i <= int(num); i++ { // go startSer(i) //} listener, err := net.Listen("tcp", ":40000") if err != nil { panic(err) } for { conn, err := listener.Accept() if err != nil { panic(err) } conn.Write([]byte(res)) } } func startSer(i int, bytes *[]byte) { addrs := ":" + strconv.Itoa(port+i) listener, err := net.Listen("tcp", addrs) if err != nil { panic(err) } conn, err := listener.Accept() if err != nil { panic(err) } n, err := conn.Write(*bytes) if err != nil { panic(err) } if n != len(*bytes) { panic("长度不对") } } func compress(file *os.File, prefix string, zw *zip.Writer) error { info, err := file.Stat() if err != nil { return err } if info.IsDir() { if prefix == "" { prefix = info.Name() } else { prefix = prefix + "/" + info.Name() } fileInfos, err := file.Readdir(-1) if err != nil { return err } for _, fi := range fileInfos { f, err := os.Open(file.Name() + "/" + fi.Name()) if err != nil { return err } err = compress(f, prefix, zw) if err != nil { return err } } } else { header, err := zip.FileInfoHeader(info) header.Method = zip.Deflate if prefix != "" { header.Name = prefix + "/" + header.Name } if err != nil { return err } writer, err := zw.CreateHeader(header) if err != nil { return err } _, err = io.Copy(writer, file) file.Close() if err != nil { return err } } return nil }
转载于:https://my.oschina.net/wgc2010/blog/2875861