Golang中文件目录操作的实现

简介: Golang中文件目录操作的实现

文件


Golang中,文件是指计算机中存储数据的实体,文件可以是文本文件、二进制文件、配置文件等。在Go语言中,通过操作文件,我们可以读取文件的内容,写入数据到文件,以及获取文件的属性等。


Golang中的文件可以分为两种类型:文本文件和二进制文件。文本文件是指只包含文本内容的文件,可以用文本编辑器打开进行查看和编辑。而二进制文件是指除文本内容外还包含其他数据的文件,如图片、音频、视频等文件。


在Golang中,文件是以文件流的形式进行操作的,文件流是指将文件中的内容作为一个流来处理的方式,通过读取流来获取文件的内容,通过写入流来向文件中写入数据。


文件目录


在Golang中,文件目录是指计算机文件系统中的文件夹或目录。目录是用于组织和存储文件的一种方式,可以包含文件和其他子目录。


Golang中的文件目录操作基本概念主要涉及文件和目录的创建、打开、读取、写入、删除等操作。


文件路径:文件路径是用于定位文件或目录的字符串。在Go语言中,可以使用绝对路径或相对路径来表示文件路径。绝对路径是从根目录开始的完整路径,而相对路径是相对于当前工作目录的路径。


文件操作:在Go语言中,可以使用os包进行文件操作。常用的文件操作包括创建文件、打开文件、读取文件内容、写入文件内容和关闭文件等。


目录操作:同样在os包中,可以进行目录操作,如创建目录、删除目录、遍历目录等。常用的目录操作函数包括Mkdir、MkdirAll、Remove、RemoveAll和ReadDir等。


文件信息:通过os包中的函数,可以获取文件的相关信息,如文件大小、修改时间、权限等。常用的文件信息函数包括Stat和FileInfo等。


文件读写:Go语言中的文件读写操作可以使用os包中的Open函数打开文件,然后使用Read和Write方法来读取和写入文件内容。还可以使用bufio包提供的缓冲读写方式来提高读写效率。


错误处理:在文件和目录操作过程中,可能会出现各种错误,如文件不存在、权限不足等。在Go语言中,通过错误返回值来处理这些错误,常用的处理方式包括检查错误值、使用defer语句关闭文件和使用log包输出错误信息等。


文件删除:在Go语言中,可以使用os包中的Remove函数删除文件。需要注意的是,删除文件是一个不可逆操作,谨慎使用。


总而言之,Go语言提供了丰富的文件和目录操作函数,可以方便地进行文件和目录的创建、打开、读写和删除等操作。开发者可以根据具体需求使用这些函数来处理文件和目录操作。


文件目录操作

读取文件

一、方法一 (file.Read())

1、只读方式打开文件 file,err := os.Open()

2、读取文件 file.Read()

3、关闭文件流 defer file Close()

package main
import (
  "fmt"
  "io"
  "os"
)
func main() {
    //只读方式打开当前目录下的main.go文件
  file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
  defer file.Close() //必须关闭文件流
  if err != nil {
    fmt.Println(err)
    return
  }
  //操作文件
  fmt.Println(file) //&{0xc000100780}
  //读取文件里面的内容
  var strSlice []byte
  var tempSlice = make([]byte, 20)
  for {
    n, err := file.Read(tempSlice)
    if err == io.EOF { //err == io.EOF表示读取完毕
      fmt.Println("读取完毕")
      break
    }
    if err != nil {
      fmt.Println("读取失败")
      return
    }
    strSlice = append(strSlice, tempSlice[:n]...) //注意写法
  }
  fmt.Println(string(strSlice)) //强制类型转换
}


成功读取到了文件的地址

060082d04d714c9195330142a7a5bd0f.png


二、方法二 (bufio读取文件)


1、只读方式打开文件 file,err := os.Open()


2、创建reader对象 reader := bufio.NewReader(file)


3、ReadString读取文件 line,err := reader.ReadString('\n')


4、关闭文件流 defer file.Close()

package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
func main() {
    file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
  defer file.Close() //必须关闭文件流
  if err != nil {
    fmt.Println(err)
    return
  }
  //bufio读取文件
  var fileStr string
  reader := bufio.NewReader(file)
  for {
    line, err := reader.ReadString('\n') //表示一次读取一行
    if err == io.EOF {
      fileStr += line
      break
    }
    if err != nil {
      fmt.Println(err)
      return
    }
    fileStr += line
  }
  fmt.Println(fileStr)
}

三、方法三 (ioutil 读取方法)

打开关闭文件的方法它都封装好了,只需要一句话就可以读取

ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")


package main
import (
  "fmt"
  "io/ioutil"
)
func main() {
    byteStr, err := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(byteStr))
}


写入文件

写入文件需要用到os.OpenFile(),其源码为:

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
  testlog.Open(name)
  f, err := openFileNolog(name, flag, perm)
  if err != nil {
    return nil, err
  }
  f.appendMode = flag&O_APPEND != 0
  return f, nil
}


name 要打开的文件名,flag 打开文件的格式,perm 文件权限,一个八进制数 r(读)04 w(写)02 x(执行)01


其中flag分为:


os.O_WRONLY 只写


os.O_CREATE 创建文件


os.O_RDONLY 只读


os.O_RDWR 读写


os.O_TRUNC 清空


os.O_APPEND 追加


一、方法一


1、打开文件 file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)


2、写入文件


file.Write([]byte(str)) //写入字节切片数据


file.WriteString("直接写入的字符串数据") //直接写入的字符串数据


3、关闭文件流 file.Close()

package main
import (
  "fmt"
  "os"
)
func main() {
    file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
  defer file.Close()
  if err != nil {
    fmt.Println(err)
    return
  }
  file.WriteString("//直接写入的字符串数据")
}

hello.go中就会被按要求追加

b123c801624d45e3970cd6c53ddba8db.png


二、方法二


1、打开文件 file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)


2、创建writer对象 writer := bufio.NewWriter(file)


3、将数据写入缓存 writer.WriteString("你好Golang\n")


4、将缓存中的内容写入文件 writer.Flush()


5、关闭文件流 file.Close()

package main
import (
  "bufio"
  "fmt"
  "os"
  "strconv"
)
func main() {
    file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
  defer file.Close()
  if err != nil {
    fmt.Println(err)
    return
  }
  writer := bufio.NewWriter(file)
  for i := 0; i < 10; i++ {
    writer.WriteString("//你好Golang" + strconv.Itoa(i) + "\n")
  }
  writer.Flush()
}


按要求追加数据


c58fa5ba21ba4703a6005dced138a1b2.png


三、方法三 (ioutil写入文件)


str := "hello Golang"

err := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/hello.go", []byte(str), 0666)

package main
import (
  "fmt"
  "io/ioutil"
)
func main() {
    str := "//hello golang"
  err := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/hello.go", []byte(str), 0666)
  if err != nil {
    fmt.Println(err)
    return
  }
}

4a53881fa3384e00bdf9e3037554868c.png


复制文件

一、方法一


byteStr, err1 := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")


err2 := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/world.go", byteStr, 0666)

package main
import (
  "fmt"
  "io/ioutil"
)
func main() {
    byteStr, err1 := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
  if err1 != nil {
    fmt.Println(err1)
    return
  }
  err2 := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/world.go", byteStr, 0666)
  if err2 != nil {
    fmt.Println(err2)
    return
  }
  fmt.Println("复制文件成功 ")
}

成功复制hello.go中的内容

c3db2f09c1c1428c9e7d9f10b16d8cc2.png

二、方法二


source, _ := os.Open(srcFileName)


destination, _ := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)


n, err := source.Read(buf)


destination.Write(buf[:n]);

package main
import (
  "fmt"
  "io"
  "os"
)
// 编写一个函数,接受两个文件路径 srcFileName 和 dstFileName
func CopyFile(srcFileName string, dstFileName string) (err error) {
  sFile, err1 := os.Open(srcFileName)
  defer sFile.Close()
  dFile, err2 := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)
  defer dFile.Close()
  if err1 != nil {
    return err1
  }
  if err2 != nil {
    return err2
  }
  var tempSlice = make([]byte, 50)
  for {
    //读取数据
    n, err := sFile.Read(tempSlice)
    if err == io.EOF {
      break
    }
    if err != nil {
      return err
    }
    //写入数据
    if _, err := dFile.Write(tempSlice[:n]); err != nil {
      return err
    }
  }
  return nil
}
func main() {
    srcFile := "D:/GoLang/go_demo/helloworld/hello.go"
  dstFile := "D:/GoLang/go_demo/helloworld/world.go"
  err := CopyFile(srcFile, dstFile)
  if err == nil {
    fmt.Println("拷贝完成")
  } else {
    fmt.Printf("拷贝错误 err = %v", err)
  }
}

成功拷贝


62e7c7921c934beab08b3492d030cb86.png


相关文章
Golang反射---结构体的操作案例大全
Golang反射---结构体的操作案例大全
82 0
|
关系型数据库 MySQL Go
Golang 语言 Web 框架 beego v2 之读操作(上)
Golang 语言 Web 框架 beego v2 之读操作
82 0
|
存储 关系型数据库 MySQL
Golang 语言 Web 框架 beego v2 之写操作
Golang 语言 Web 框架 beego v2 之写操作
151 0
|
Unix Go
Golang 语言的标准库 os 包怎么操作目录和文件?
Golang 语言的标准库 os 包怎么操作目录和文件?
44 0
|
4月前
|
Go
golang对遍历目录操作的优化
【8月更文挑战第7天】在Golang中优化目录遍历能提升性能。可通过缓冲读取减少系统调用、使用协程并发处理大量文件、按需跳过不必要目录及仅获取所需文件信息等方式实现。示例代码展示了如何运用协程并行遍历子目录以加快处理速度。实际应用时需依据场景选择合适策略。
|
7月前
|
关系型数据库 MySQL Go
golang使用gorm操作mysql1
golang使用gorm操作mysql1
golang使用gorm操作mysql1
|
7月前
|
存储 Go 数据处理
Golang简单实现IO操作
Golang简单实现IO操作
59 1
|
7月前
|
Go
golang使用gorm操作mysql3,数据查询
golang使用gorm操作mysql3,数据查询
|
7月前
|
JSON 前端开发 Java
golang使用gorm操作mysql2
golang使用gorm操作mysql2
|
7月前
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
427 2