Go語言模擬文件斷點續傳以及多協程讀取寫入文件操作


今天整理了一個Go語言多協程拷貝文件的案例,之前用Java寫過,這次用Go語言來寫一下,代碼不難,也很簡單,但是網上沒有案例,整了很長時間。下面貼出來,供其他人參考學習。

func main(){

	fileName := "F:\\myWorks\\麗君-全家福.png"
	desfileName := "F:\\myWorks\\麗君-全家福-bak.png"
	sfile,err := os.Open(fileName)
	if err != nil{
		fmt.Println(nil)
	}

  
	info,_ := os.Stat(fileName)
	size := info.Size()
	var scount  int64 = 1
    //這里切分原意為通過協程來分段讀取
	if size % 2 == 0{
		scount *= 2
	}else if size % 3 == 0 {
		scount *= 3
	}else{
		scount *= 1
	}
	si := size / scount
	fmt.Printf("文件總大小:%v, 分片數:%v,每個分片大小:%v",size,scount,si)

	desF,err := os.OpenFile(desfileName,os.O_CREATE|os.O_RDONLY|os.O_APPEND,0755)
	if err != nil{
		fmt.Println(err)
	}

	for i:=0;i<=int(scount);i++{
			//申明一個byte
			b := make([]byte,si)
			//從哪個位置開始讀
			sfile.Seek(int64(i)*si,0)
			//讀到byte數組里邊
			sfile.Read(b)
			//從哪個位置開始寫
			desF.Seek(int64(i)*si,0)
			//寫入
			desF.Write(b)
	}

	defer desF.Close()
	defer sfile.Close()
}

上面的版本是一個按順序寫入的,雖然說是分片了但還是單協程,接下來改造一個多協程版本的。

func main(){

	fileName := "F:\\myWorks\\首頁_1.png"
	desfileName := "F:\\myWorks\\首頁_1-bak.png"
	sfile,err := os.Open(fileName)
	if err != nil{
		fmt.Println(nil)
	}

	info,_ := os.Stat(fileName)
	size := info.Size()
	var scount  int64 = 1
	if size % 2 == 0{
		scount *= 2
	}else if size % 3 == 0 {
		scount *= 3
	}else{
		scount *= 1
	}

	si := size / scount
	fmt.Printf("文件總大小:%v, 分片數:%v,每個分片大小:%v\n",size,scount,si)

	desF,err := os.OpenFile(desfileName,os.O_CREATE|os.O_RDWR,0755)
	if err != nil{
		fmt.Println(err)
	}

	for i:=0;i<int(si);i++{
		go func(vs int){
			//申明一個byte
			b := make([]byte,si)
			//從指定位置開始讀
			sfile.ReadAt(b,int64(vs)*si)
			//從指定位置開始寫
			desF.WriteAt(b,int64(vs)*si)

		}(i)
	}
	time.Sleep(time.Second*5)
	defer desF.Close()
	defer sfile.Close()
}

有問題可以在下方評論,技術問題可以私聊我。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM