使用os完成文件操作(常用)

zhaoyf · · 1998 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

需要用golang完成一个写入文件的程序,第一次用到os下的这些函数,给自己记个文档。 看源码的过程中,发现使用golang中的文件创建等函数,需要了解文件权限位的知识(ps:Java里从来就调个方法就解决了,从没仔细了解过),这里贴一个[讲解权限位](https://blog.csdn.net/devyfong/article/details/8066369)的博客。我使用的IDE是IntelliJ GoLand,看源码非常方便,推荐和我一样的初学者使用 ### func Getwd() (dir string, err error) {...} 获得程序运行路径,相当于Linux下运行`pwd`命令 ``` // 代码 package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getwd()) } // 命令行执行 bogon:postback zhaoyf$ go run Application.go /Users/zhaoyf/Code/go_path/src/adr-postback-consumer/postback <nil> bogon:postback zhaoyf$ cd ~ bogon:~ zhaoyf$ go run Code/go_path/src/adr-postback-consumer/postback/Application.go /Users/zhaoyf <nil> ``` ### func IsNotExist(err error) bool {...} 判断err是否在提示文件或目录不存在 ``` // ----- 源码 // error.go -> IsNotExist() func IsNotExist(err error) bool { return isNotExist(err) } // error_unix.go -> isNotExist() // 我的环境是Mac,可能其他系统文件名不同 func isNotExist(err error) bool { err = underlyingError(err) // 当代码看到这一步发现,这个方法是用来比较参数err是不是一个指定的错误 return err == syscall.ENOENT || err == ErrNotExist } // error.go -> underlyingError() // 返回已知os错误类型的底层错误 func underlyingError(err error) error { switch err := err.(type) { case *PathError: return err.Err case *LinkError: return err.Err case *SyscallError: return err.Err } return err } ``` ### func Mkdir(name string, perm FileMode) error {...} 根据给定路径[name]创建文件夹,并通过perm指定文件夹的权限 ``` // 自己封装的创建文件夹函数 func mkdir(path string) { err := os.Mkdir(path, os.ModeDir) // 当返回error时,且error不是文件已存在错误,打印错误信息 if err != nil && os.IsNotExist(err) { fmt.Printf("[init] create log dir[%s] falied :%s\n", path, err) } } ``` ### func OpenFile(name string, flag int, perm FileMode) (*File, error) {...} 返回可以执行 I/O 操作的方法,通过操作返回值的 *File 进行读写删,请注意代码中流资源的释放 ``` // 具体常量代码篇幅太长,请根据如下所示自行寻找 // flag 取值 详见file.go -> 65行常量定义 // perm 取值 详见types.go -> 42行常量定义 ``` ### func Create(name string) (*File, error) {...} 不解释,直接看源码吧 ``` func Create(name string) (*File, error) { // 如果对 O_* 常量不理解,可以看上述 OpenFile() 函数中的 flag 取值 return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) } ``` ### func (f *File) Write(b []byte) (n int, err error) {...} 写入文件,返回写入成功的字节数 ``` // 偷个懒,示例直接贴 writeString() 函数的源码 // WriteString is like Write, but writes the contents of string s rather than // a slice of bytes. func (f *File) WriteString(s string) (n int, err error) { return f.Write([]byte(s)) } // 自己封装的写入文本的函数 func write(log string, filePath string) { file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) if err != nil && os.IsNotExist(err) { fmt.Printf("[write] create log file[%s] falied :%s\n", filePath, err) } defer file.Close() file.WriteString(log + "\n") } ``` ### os.PathSeparator 文末加个小彩蛋,文件路径的分隔符,win用`\\` unix用`/`,为了避免在代码中写死造成的 bug,可以用这个常量代替

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1998 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传