“–————人与人之间还是直接点好——————”

1.创建文件
os.Create() file,
err := os.Create("./demo.txt")

func main() {
 file, err := os.Create("./demo.txt")
 fmt.Printf("%T", file)
 //*os.File 文件指针类型
  if err != nil {
  fmt.Println("文件创建失败。")
  return
 }
 defer file.Close()
}

//绝对路径 如果文件已存在,会将文件清空。
//创建失败!路径不存在,权限不足(root),打开文件数量超过上限,磁盘空间不足等

2.打开文件

打开文件open()
func Open(name string) (file File, err error) Open打开一个文件用于读取。
如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。 如果出错,错误底层类型是
PathError。

3.打开临时文件

openfile() func OpenFile(name string, flag int, perm FileMode) (file File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。
它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。
如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是
PathError。

4.延时关闭文件

file.close() func (f *File) Close() error defer延迟调用,程序结束关闭文件释放资源 Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

*5.func (f File) Write(b []byte) (n int, err error)

 str := "hello world!"
    data := []byte(str)
    count, err = file.Write(data)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Write %d \n", count) 
 //Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。
 //如果返回值n!=len(b),本方法会返回一个非nil的错误。

*6.func (f File) WriteString(s string) (ret int, err error)

 file, err := os.Open(EaplocalPath)
 if err != nil {
  return err
 }
 defer file.Close()
 count, err := file.WriteString("welcomelearngo")
 CheckError(err)
 fmt.Printf("WriteString %d \n", count)
    
//WriteString类似Write,但接受一个字符串参数。

*7.func (f File) Read(b []byte) (n int, err error)

 data := make([]byte, 1024)//文件的信息可以读取进一个[]byte切片
 count, err := file.Read(data)   
 if err != nil {
     if err == io.EOF {//文件结尾
         fmt.Println("文件读取结束")   
     }
  }
    
 fmt.Printf("read %d bytes: %q\n", count, data[:count])
    
 //Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误.
 //文件终止标志是读取0个字节且返回值err为io.EOF

8. func ReadFile(filename string) ([]byte, error)

 content, err := ioutil.ReadFile(metaPath)
 if err != nil {
  log.Error("ReadFile failed :\n", err)
  return
 }
 
 //ReadFile读取文件中的所有数据
 // 返回读取的数据和读取过程中遇到的任何错误
 // 如果读取成功,则 err 返回 nil,而不是 EOF

9. func WriteFile(filename string, data []byte, perm os.FileMode) error

 err = ioutil.WriteFile(metaPath, routeValue, 0666)
 if err != nil {
  log.Error("WriteFile failed :\n", err)
  return
 }
 
 //WriteFile向文件写入数据
 // 如果之前有数据则会将原来的进行清空
 // 如果文件不存在,将以指定的权限创建该文件(,0666)
 // 返回写入过程中遇到的任何错误

10.文件按行读取(文件扫描器)
//buifo带缓冲式按行读取文件
//func NewReader(rd io.Reader) *Reader
//func (b *Reader) ReadString(delim byte) (line string, err error)
ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。
如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。
当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。

func eaplocaladd() error {
 //打开源文件和临时文件(返回文件指针句柄)
 file, err := os.Open(EaplocalPath)
 if err != nil {
  return err
 }
 defer file.Close()
 temp, err := os.OpenFile(Temfile, os.O_RDWR|os.O_CREATE, 0766)
 if err != nil {
  return err
 }
 defer temp.Close()
  //获取一个Reader(带缓冲), 通过 file 去构建reader
 reader := bufio.NewReader(file)
 for {
  // 读取文件的一行
  linestr, err := reader.ReadString('\n')
  if err != nil {
   if err == io.EOF {
    break
   }
   return err
  }
  _, err = temp.WriteString(linestr)
  if err != nil {
   return err
  }
 return nil
}

11.示例:临时目录、临时文件 默认创建文件夹在root/temp/

func main() {

 //12.创建临时目录
 dir, err := ioutil.TempDir("", "Test") //(“路径”,“文件夹名”)
 if err != nil {
  fmt.Println(err)
 }
 defer os.Remove(dir) // 用完删除
 fmt.Printf("%s\n", dir)
 
 //13.创建临时文件
 f, err := ioutil.TempFile(dir, "Test")
 if err != nil {
  fmt.Println(err)
 }
 defer os.Remove(f.Name()) // 用完删除
 fmt.Printf("%s\n", f.Name())
}

14.示例:读取目录

func main() {
 rd, err := ioutil.ReadDir("/")
 fmt.Println(err)
 for _, fi := range rd {
    if fi.IsDir() {
     fmt.Printf("[%s]\n", fi.Name())
    } else {
      fmt.Println(fi.Name())
    }  
 }
 }

15.文件拷贝func Copy(dst Writer, src Reader) (written int64, err error)
将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;
否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。

w, err:= CopyFile("filecopy.txt","file.txt")
if err != nil{
 fmt.Println(err)
}

16.字符串转义

func EscapeCharacter(str string) string {
 return strings.Replace(str, "\\n", "\n", -1)   
 //将换行符转换未字符串 \n
}

17.判断文件是否存在

func IsFileExist(path string) bool {
 _, err := os.Stat(path)
 return err == nil || os.IsExist(err)
}

18.删除一个文件,先判断文件是存在,再进行删除否

func DeleteFile(path string) error {
 if IsFileExist(path) == false {
  return nil
 }
 return os.Remove(path)
}

注意: 文件中中文乱码问题,确保使用UTF-8编码