通过之前的文章已经学习了文件的创建、读取以及写入。接下来学习文件的一些基本操作,例如:复制、移动、遍历文件夹等等。
复制文件
Go 文件复制我们可以借助 io 包的 Copy 方法来完成。
- func Copy(dst Writer, src Reader) (written int64, err error)
written 表示写入的字节数。
普通复制
package main
import "fmt"
import "os"
import "io"
func main () {
srcFile, err := os.Open("D:\\tmp\\f1.txt")
if err != nil {
fmt.Printf("打开文件错误,%v", err)
return
}
defer srcFile.Close()
destFile, err := os.Create("d:\\tmp\\f2.txt")
if err != nil {
fmt.Printf("创建文件错误,%v", err)
return
}
defer destFile.Close()
written, err := io.Copy(destFile, srcFile)
if err == nil {
fmt.Printf("复制成功,复制的字节数为: %d", written)
}
}
如上代码演示了借助 io.Copy 方法实现文件的复制。
基于缓冲复制
同时也可以使用 Reader 和 Writer 来完成文件的复制。
package main
import "fmt"
import "os"
import "io"
import "bufio"
func main () {
srcFile, err := os.Open("D:\\tmp\\f1.txt")
if err != nil {
fmt.Printf("打开文件错误,%v", err)
return
}
defer srcFile.Close()
reader := bufio.NewReader(srcFile)
dstFile, err := os.Create("d:\\tmp\\f3.txt")
if err != nil {
fmt.Printf("创建文件错误,%v", err)
return
}
writer := bufio.NewWriter(dstFile)
defer func () {
writer.Flush()
dstFile.Close()
}()
written, err := io.Copy(writer, reader)
if err == nil {
fmt.Printf("复制成功,复制的字节数为: %d", written)
}
}
如上代码演示了借助 io.Copy 及 bufio 包中的 Reader 和 Writer 来完成的文件复制。
移动文件
移动文件我们可以借助 io.Rename 方法。
- func Rename(oldpath, newpath string) error
package main
import "fmt"
import "os"
func main () {
err := os.Rename("D:\\tmp\\f2.txt", "D:\\tmp\\ht\\f2.txt")
if err != nil {
fmt.Println("移动文件成功")
}
}
遍历文件夹
遍历文件夹可以使用 ioutil 库的 ioutil.ReadDir 方法。该方法会返回一个数组, 数组元素有文件的属性。
- func ReadDir(dirname string) ([]fs.FileInfo, error)
package main
import "fmt"
import "io/ioutil"
func main () {
fs, _ := ioutil.ReadDir("d:\\tmp")
for _, f := range fs {
if f.IsDir() {
fmt.Printf("%s是一个目录\n", f.Name())
} else {
fmt.Printf("%s是一个文件\n", f.Name())
}
}
}