go语言实现文件的拷贝,网络间传输文件

文件的拷贝

package main

import (
	"os"
	"fmt"
	"io"
)

func main(){
	args := os.Args
	if len(args) != 3{
		fmt.Println("必须是 xxx srcFile dstFile")
		return
	}
	srcFileName := args[1]
	dstFileName := args[2]
	srcFile,err1 := os.Open(srcFileName)
	dstFile,err2 := os.Create(dstFileName)
	if err1 !=nil{
		fmt.Println("err1=",err1)
		return
	}
	if err2 !=nil{
		fmt.Println("err2=",err2)
	}
	defer srcFile.Close()
	defer dstFile.Close()
	buf := make([]byte, 4*1024)
	for {
		n,err3:=srcFile.Read(buf)
		if err3!=nil{
			if err3==io.EOF{
				break
			}
			fmt.Println("err3=",err3)
		}
		dstFile.Write(buf[:n])
	}

}

  

tcp传输文件

//发送方
package main

import (
	"fmt"
	"os"
	"net"
	"io"
)

func sendFile(path string,conn net.Conn){
	//以只读方法打开文件
	f,_:=os.Open(path)
	defer f.Close()
	buf := make([]byte,1024*4)
	for {
		n,err:=f.Read(buf)
		if err!=nil{
			if err==io.EOF{
				fmt.Println("文件发送完毕")
				return
			}
			fmt.Println("出错了")
			return

		}
		conn.Write(buf[:n])
	}
}

func main() {
	//提示用户输入文件路径并获取
	fmt.Println("请输入要传输的文件:")
	var path string
	fmt.Scan(&path)

	//获取文件的名字
	fileInfo,err := os.Stat(path)
	if err!=nil{
		fmt.Println("err1=",err)
		return
	}
	fileName := fileInfo.Name()

	//主动连接服务器
	conn,_:=net.Dial("tcp","localhost:8080")
	defer conn.Close()

	//给接收方先发送文件名
	conn.Write([]byte(fileName))

	//接收对方的回复,如果为ok,说明对方准备好,可以发文件
	buf := make([]byte,1024)
	n,_:=conn.Read(buf)
	if string(buf[:n]) == "ok"{
		//发送内容
		sendFile(path,conn)
	}


}






//接收方

package main

import (
	"net"
	"fmt"
	"os"
	"io"
)

func recvFile(fileName string,conn net.Conn){
	f,_:=os.Create("mmp"+fileName)
	defer f.Close()
	for {
		buf:=make([]byte,1024)
		n,err :=conn.Read(buf)
		if err!=nil{
			if err ==io.EOF{
				fmt.Println("文件接收完毕")
				return
			}
		}
		f.Write(buf[:n])
	}
}

func main(){
	listener,_:=net.Listen("tcp","localhost:8080")
	defer listener.Close()

	//阻塞等待用户连接
	conn,_:=listener.Accept()

	buf:=make([]byte,1024)

	//先读取对方发来的文件名
	n,err:=conn.Read(buf)
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	fileName := string(buf[:n])
	conn.Write([]byte("ok"))
	recvFile(fileName,conn)

}

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9277795.html