Go语言中的文件操作函数
Go语言自带了很多文件操作相关的函数,包括读取、写入、复制、移动、删除、重命名等等。我们在编写代码时可以通过这些函数对文件进行操作。
文件读取
在Go语言中,我们可以使用os包的Open()函数打开一个文件,再通过bufio包中的Scanner()函数进行逐行读取。
func readFile(filename string) ([]string, error) {
var lines []string
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
return lines, scanner.Err()
}
通过上述代码,我们可以把指定文件中的每一行读取出来并存储在一个字符串数组中。同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
文件写入
与文件读取一样,我们也可以使用os包的OpenFile()函数创建或打开一个文件,然后通过bufio包中的Writer()函数进行文件写入。
func writeFile(filename string, lines []string) error {
file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer file.Close()
writer := bufio.NewWriter(file)
for _, line := range lines {
fmt.Fprintln(writer, line)
}
return writer.Flush()
}
通过上述代码,我们可以将一个字符串数组中的内容按行写入到指定的文件中。同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
文件复制
如果我们需要复制一个文件,那么可以使用os包中的Open()函数打开文件进行读取,再使用os包中的Create()函数创建新文件进行写入。
func copyFile(srcFile, dstFile string) error {
src, err := os.Open(srcFile)
if err != nil {
return err
}
defer src.Close()
dst, err := os.Create(dstFile)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
if err != nil {
return err
}
return nil
}
通过上述代码,我们可以将指定的源文件复制到指定的目标文件中。同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
文件移动
如果我们需要将一个文件移动到指定位置,可以使用os包中的Rename()函数进行文件重命名和移动。
func moveFile(srcFile, dstFile string) error {
return os.Rename(srcFile, dstFile)
}
通过上述代码,我们可以将指定文件移动到指定位置。同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
文件删除
如果我们需要删除一个文件,可以使用os包中的Remove()函数进行删除。
func deleteFile(filename string) error {
return os.Remove(filename)
}
通过上述代码,我们可以删除指定文件,同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
文件重命名
如果我们需要将一个文件重命名,可以使用os包中的Rename()函数进行文件重命名和移动。
func renameFile(oldFile, newFile string) error {
return os.Rename(oldFile, newFile)
}
通过上述代码,我们可以将指定文件进行重命名,同时,如果出现错误,我们也可以通过返回值将错误信息返回出去。
Go语言中的文件压缩解压缩功能
在Go语言中,我们可以使用archive/zip包和archive/tar包实现对文件的压缩和解压缩。
zip包
archive/zip包提供了对zip文件的压缩和解压缩功能。
压缩文件
使用archive/zip包创建zip压缩文件非常简单,只需要打开或创建一个文件,然后将需要压缩的文件读取进来,并使用archive/zip中的Writer()函数进行写入即可。
func zipFile(filepath string, dest string) error {
zipfile, err := os.Create(dest)
if err != nil {
return err
}
defer zipfile.Close()
archive := zip.NewWriter(zipfile)
defer archive.Close()
info, err := os.Stat(filepath)
if err != nil {
return nil
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = filepath
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
file, err := os.Open(filepath)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
if err != nil {
return err
}
return nil
}
通过上述代码,我们可以将指定的文件进行压缩,并保存到指定的压缩文件中。如果出现错误,我们也可以通过返回值将错误信息返回出去。
解压文件
使用archive/zip包进行zip文件的解压缩也比较简单,只需要打开待解压缩的文件,然后使用archive/zip包中的Read()函数进行读取,并将读取到的文件进行写入即可。
func unzipFile(src, dest string) error {
zipReader, err := zip.OpenReader(src)
if err != nil {
return err
}
defer zipReader.Close()
for _, file := range zipReader.File {
filePath := path.Join(dest, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
err = os.MkdirAll(path.Dir(filePath), os.ModePerm)
if err != nil {
return err
}
writer, err := os.Create(filePath)
if err != nil {
return err
}
defer writer.Close()
reader, err := file.Open()
if err != nil {
return err
}
defer reader.Close()
_, err = io.Copy(writer, reader)
if err != nil {
return err
}
}
return nil
}
通过上述代码,我们可以将指定的zip压缩文件进行解压缩,并将解压缩的文件写入指定目录中。如果出现错误,我们也可以通过返回值将错误信息返回出去。
tar包
archive/tar包提供了对tar文件的压缩和解压缩功能。
压缩文件
使用archive/tar包创建tar压缩文件非常简单,只需要打开或创建一个文件,然后将需要压缩的文件读取进来,并使用archive/tar中的Writer()函数进行写入即可。
func tarFile(filepath string, dest string) error {
tarfile, err := os.Create(dest)
if err != nil {
return err
}
defer tarfile.Close()
info, err := os.Stat(filepath)
if err != nil {
return err
}
header := &tar.Header{
Name: filepath,
Mode: int64(info.Mode()),
Size: info.Size(),
}
writer := tar.NewWriter(tarfile)
defer writer.Close()
err = writer.WriteHeader(header)
if err != nil {
return err
}
file, err := os.Open(filepath)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
if err != nil {
return err
}
return nil
}
通过上述代码,我们可以将指定的文件进行压缩,并保存到指定的tar压缩文件中。如果出现错误,我们也可以通过返回值将错误信息返回出去。
解压文件
使用archive/tar包进行tar文件的解压缩也比较简单,只需要打开待解压缩的文件,然后使用archive/tar包中的Reader()函数进行读取,并将读取到的文件进行写入即可。
func untarFile(src, dest string) error {
file, err := os.Open(src)
if err != nil {
return err
}
defer file.Close()
reader := tar.NewReader(file)
for {
header, err := reader.Next()
if err != nil {
if err == io.EOF {
break
}
return err
}
filePath := path.Join(dest, header.Name)
switch header.Typeflag {
case tar.TypeDir:
os.MkdirAll(filePath, os.ModePerm)
case tar.TypeReg:
err = os.MkdirAll(path.Dir(filePath), os.ModePerm)
if err != nil {
return err
}
writer, err := os.Create(filePath)
if err != nil {
return err
}
defer writer.Close()
_, err = io.Copy(writer, reader)
if err != nil {
return err
}
default:
return fmt.Errorf("unsupported type: %v", header.Typeflag)
}
}
return nil
}
通过上述代码,我们可以将指定的tar压缩文件进行解压缩,并将解压缩的文件写入指定目录中。如果出现错误,我们也可以通过返回值将错误信息返回出去。