go言語でファイルをコピーする


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