golang追加内容到文件末尾

字数349 阅读54 评论0 喜欢2

golang读写文件,网上很多教程了
但是今天有个需求,想要把内容追加写到文件末尾
google了好久,没有查到
研究了一会儿file库,终于让我找到(蒙到)了追加的办法
最主要的2个函数:

func (f *File) Seek(offset int64, whence int) (ret int64, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)

  • Seek()查到文件末尾的偏移量
  • WriteAt()则从偏移量开始写入

以下是栗子:
// fileName:文件名字(带全路径)
// content: 写入的内容
func appendToFile(fileName string, content string) error {
// 以只写的模式,打开文件
f, err := os.OpenFile(fileName, os.O_WRONLY, 0644)
if err != nil {
fmt.Println("cacheFileList.yml file create failed. err: " + err.Error())
} else {
// 查找文件末尾的偏移量
n, _ := f.Seek(0, os.SEEK_END)
// 从末尾的偏移量开始写入内容
_, err = f.WriteAt([]byte(content), n)
}
defer f.Close()
return err}

拿去用吧,别客气 :)
觉得目前国内golang的文档博客还是稍微缺乏了点,
希望大家平时coding中有什么心得体会互相分享,
让golang越来越好用!


2016/08/31 记:
我就是笨蛋,明明最简单的方式就可以实现了:
f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_APPEND, 0666)
以写跟追加的方式打开文件。。。

下面附有操作文件的四种方式

package main

import (
 "bufio"  //缓存IO
 "fmt"
 "io/ioutil" //io 工具包
 "io"
 "os"
)

func check(e error) {
 if e != nil {
  panic(e)
 }
}

/**
 * 判断文件是否存在  存在返回 true 不存在返回false
 */
func checkFileIsExist(filename string) (bool) {
 var exist = true;
 if _, err := os.Stat(filename); os.IsNotExist(err) {
  exist = false;
 }
 return exist;
}

/**
    from: http://www.isharey.com/?p=143
 */

func main() {
 var wireteString = "测试n"
 var filename = "./output1.txt";
 var f    *os.File
 var err1   error;
 /***************************** 第一种方式: 使用 io.WriteString 写入文件 ***********************************************/
 if checkFileIsExist(filename) {  //如果文件存在
  f, err1 = os.OpenFile(filename, os.O_APPEND, 0666)  //打开文件
  fmt.Println("文件存在");
 }else {
  f, err1 = os.Create(filename)  //创建文件
  fmt.Println("文件不存在");
 }
 check(err1)
 n, err1 := io.WriteString(f, wireteString) //写入文件(字符串)
 check(err1)
 fmt.Printf("写入 %d 个字节n", n);

/*****************************  第二种方式: 使用 ioutil.WriteFile 写入文件 ***********************************************/
 var d1 = []byte(wireteString);
 err2 := ioutil.WriteFile("./output2.txt", d1, 0666)  //写入文件(字节数组)
 check(err2)

/*****************************  第三种方式:  使用 File(Write,WriteString) 写入文件 ***********************************************/
 f, err3 := os.Create("./output3.txt")  //创建文件
 check(err3)
 defer f.Close()
 n2, err3 := f.Write(d1)  //写入文件(字节数组)
 check(err3)
 fmt.Printf("写入 %d 个字节n", n2)
 n3, err3 := f.WriteString("writesn") //写入文件(字节数组)
 fmt.Printf("写入 %d 个字节n", n3)
 f.Sync()

/***************************** 第四种方式:  使用 bufio.NewWriter 写入文件 ***********************************************/
 w := bufio.NewWriter(f)  //创建新的 Writer 对象
 n4, err3 := w.WriteString("bufferedn")
 fmt.Printf("写入 %d 个字节n", n4)
 w.Flush()
 f.Close()
}

golang操作文件的四种方法的更多相关文章

  1. IO流----操作文件的9种方法代码实现

    IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1:          每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...

  2. .net(C#)操作文件的几种方法汇总

    .net(C#)操作文件的几种方法汇总 System.IO命名空间下类的用法:在System.IO名称空间中包含了用于文件输入输出的主要类.File:实用类,提供许多静态方法,用于移动.复制和删除文件 ...

  3. PHP读写XML文件的四种方法

    PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...

  4. 精----Java读取xml文件的四种方法

    xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VA ...

  5. Qt 添加外部库文件(四种方法)

    Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...

  6. OpenCV坐标系与操作像素的四种方法

    像素是图像的基本组成单位,熟悉了如何操作像素,就能更好的理解对图像的各种处理变换的实现方式了. 1.at方法 第一种操作像素的方法是使用"at",如一幅3通道的彩色图像image的 ...

  7. Properties读取资源文件的四种方法

    package com.action; import java.io.InputStream; import java.util.Locale; import java.util.Properties ...

  8. java读取xml文件的四种方法

    Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> ...

  9. C# 下载文件的四种方法

    C# 文件下载四方法 - CSDN论坛 - CSDN.NET using System; using System.Data; using System.Configuration; using Sy ...

随机推荐

  1. SlickGrid example 3: 可编辑单元

    <button onclick="grid.setOptions({autoEdit:true})"> 设置自动辅助编辑下一个元素.   代码: <!DOCTYP ...

  2. Javascript中自动切换焦点

      <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title&g ...

  3. 20150608_Andriod 发布问题处理

    参考地址: http://blog.csdn.net/cxc19890214/article/details/39120415 问题:当我们开发完成一个Android应用程序后,在发布该应用程序之前必 ...

  4. Codeforces Round #337 Vika and Segments

    D. Vika and Segments time limit per test:  2 seconds     memory limit per test:  256 megabytes input ...

  5. OracleHelper 动软生成

    using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...

  6. JAVA基础知识之JVM-——URLClassLoader

    URLClassLoader是ClassLoader的一个实现类,它既能从本地加载二进制文件类,也可以从远程加载类. 它有两个构造函数, 即 URLClassLoader(URL[] urls),使用 ...

  7. Poj(3615),Floyd,最大值中的最小值

    题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个 ...

  8. Github for Windows安装

    下载软件:https://desktop.github.com/ 安装之前要求系统先要有安装.net framework 4.5,不然软件安装的时候会自动上网下载安装,这软件下载起来非常慢. 第一次操 ...

  9. Entity Framework 第三篇 实体特性声明

    Entity Framework中对实体的特性声明有着严格的要求 1.实体必须要有主键特性,但是如果实体没有主键特性那怎么办? public int ExecuteSqlCommand(string ...

  10. mongodb(4查询)

    第一个参数决定要返回那些文档 db.test.find()返回所有文档 db.test.find({"age":27}) db.test.find({"username& ...