怎樣使用go語言將文件複製成另外一文件?go語言標準包io裏提供一個簡單的函數copy實現了這個功能,下面是一個例子。
////////////
package main
import (
"fmt"
"io"
"os"
)
func main() {
CopyFile(os.Args[1], os.Args[2]) // os.Args[1]爲目標文件,os.Args[2]爲源文件
fmt.Println("複製完成",)
}
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return
}
defer dst.Close()
return io.Copy(dst, src)
}
//////////////////
e:\go_source\Go_program_code\temptest>temptest.exe abc.log ex14061310.log
複製
2917891
字節!
e:\go_source\Go_program_code\temptest>ls -al
total 3947
drwxr-xr-x 2 sharp Administ 0 Oct 24 10:23 .
drwxr-xr-x 25 sharp Administ 8192 Oct 20 17:20 ..
-rw-r--r-- 1 sharp Administ
2917891
Oct 24 11:05 abc.log
-rw-r--r-- 1 sharp Administ
2917891
Jun 13 10:00 ex14061310.log
-rwxr-xr-x 1 sharp Administ 2236928 Oct 24 11:05 temptest.exe
-rw-r--r-- 1 sharp Administ 520 Oct 24 11:05 temptest.go
/////
注意這裏defer的使用,在源文件和目的文件打開後都跟了一個defer延遲關閉文件。若是目標文件後面沒有使用defer dst.Close(),那麼一旦建立目標文件調試失敗,它將直接返回錯誤,那麼,會致使源文件一直保持打開狀態,這樣資源就得不到釋放。所以,在go語言裏,記得open一個文件作了錯誤判斷後要緊跟一個defer close延遲調用。
io.Copy的函數原型以下
func Copy(dst Writer, src Reader) (written int64, err error)
Copy函數從源到目的的複製,直到讀到源的EOF或者出現其它的錯誤,它返回所複製的字節數及複製過程出現的第一個錯誤。若是成功複製,Cop返回的是 err ==nil,由於Copy被定義爲從源複製直到遇到EOF,它不把EOF看成一個錯誤。
io包裏還有一個io.CopyN的函數,原型以下
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
CopyN將從源文件裏複製n字節(或者遇到錯誤中斷)到目標文件,並返到實際複製的節數
package
main
import (
"fmt"
"io"
"os"
)
func main() {
counter, _ := CopyFile(os.Args[1], os.Args[2], os.Args[3]) // os.Args[1]爲目標文件,os.Args[2]爲源文件
fmt.Println("複製", counter, "字節!")
}
func CopyFile(dstName, srcName string, n int64) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return
}
defer dst.Close()
return io.CopyN(dst, src, n) //
}
/////////
e:\go_source\Go_program_code\temptest>temptest.exe test.go temptest.go 1000
複製
526
字節!
e:\go_source\Go_program_code\temptest>ls -al
total 3948
drwxr-xr-x 2 sharp Administ 0 Oct 24 11:10 .
drwxr-xr-x 25 sharp Administ 8192 Oct 20 17:20 ..
-rw-r--r-- 1 sharp Administ 2917891 Oct 24 11:05 abc.log
-rw-r--r-- 1 sharp Administ 2917891 Jun 13 10:00 ex14061310.log
-rwxr-xr-x 1 sharp Administ 2236928 Oct 24 11:05 temptest.exe
-rw-r--r-- 1 sharp Administ
526 Oct 24 11:10 temptest.go
-rw-r--r-- 1 sharp Administ
526 Oct 24 11:10 test.go