复制方法一:
func copyFile1(srcFile,destFile string)(int,error){ file1,err:=os.Open(srcFile) if err != nil{ return 0,err } file2,err:=os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm) if err !=nil{ return 0,err } defer file1.Close() defer file2.Close() //拷贝数据 bs := make([]byte,1024,1024) n :=-1//读取的数据量 total := 0 for { n,err = file1.Read(bs) if err == io.EOF || n == 0{ fmt.Println("拷贝完毕。。") break }else if err !=nil{ fmt.Println("报错了。。。") return total,err } total += n file2.Write(bs[:n]) } return total,nil }
复制方法二
func copyFile2(srcFile, destFile string)(int64,error){ file1,err:=os.Open(srcFile) if err != nil{ return 0,err } file2,err:=os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm) if err !=nil{ return 0,err } defer file1.Close() defer file2.Close() return io.Copy(file2,file1) }
复制方法三L:
func copyFile3(srcFile, destFile string)(int,error){ input, err := ioutil.ReadFile(srcFile) if err != nil { fmt.Println(err) return 0,err } err = ioutil.WriteFile(destFile, input, 0644) if err != nil { fmt.Println("操作失败:", destFile) fmt.Println(err) return 0,err } return len(input),nil }
文件断点续传:
package main import ( "strings" "fmt" "log" "os" "io" "strconv" ) func main() { srcFile :="D:\\BaiduNetdiskDownload\\2019Golang进阶实战编程(学完基础必看)【千锋GO语言】\\2019版-千锋golang进阶-课件\\第08节_复制文件\\第8节_复制文件.md" s := srcFile[strings.LastIndex(srcFile,"\\")+1:] fmt.Println(s) tempFile :=s +"temp.md" fmt.Println(tempFile) //获取目标文件得file file, e := os.Open(srcFile) handle1(e) //获取输出文件得file openFile, e := os.OpenFile(s, os.O_WRONLY|os.O_CREATE, os.ModePerm) handle1(e) //获取临时文件得file file2, e := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm) handle1(e) defer file.Close() defer file2.Close() defer openFile.Close() // 读取临时文件的内容,设置从哪里开始 // seek 方法,设置偏移量,后面参数距离开始,还是结束,还是当前文职 file2.Seek(0,io.SeekStart) //设置读的字节数 bs := make([]byte, 100, 100) //这个地方不需要处理异常 n, err := file2.Read(bs) /*if err != nil{ fmt.Println(err) }*/ fmt.Println(n) countstr := string(bs[:n]) fmt.Println(countstr) // 讲字符串转哈伟int类型去接受 i, _ := strconv.ParseInt(countstr, 10, 64) fmt.Println(i) file.Seek(i,0) openFile.Seek(i,0) bytes := make([]byte, 1024, 1024) n1 :=-1 n2 :=-1 total :=int(i) for{ n1, err = file.Read(bytes) if n1 ==0||err==io.EOF{ fmt.Println("文件赋值完毕") file2.Close() os.Remove(tempFile) fmt.Println(total) break } n2, _ = openFile.Write(bytes[:n1]) total +=n2 file2.Seek(0,io.SeekCurrent) file2.WriteString(strconv.Itoa(n2)) /*if total>800{ panic("zhongduan") }*/ } } func handle1(e error) { if e !=nil { log.Fatal(e) } }