Go语言学习笔记—golang标准库os包

一 权限

权限perm,在创建文件时才需要指定,不需要创建新文件时可以将其设定为0。虽然go语言给perm权限设定了很多的常量,但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致)。

权限项文件类型执行执行执行
字符表示(d;l;c;s;p)rwxrwxrwx
数字表示421421421
权限分配文件所有者文件所有者文件所有者文件所属组用户文件所属组用户文件所属组用户其他用户其他用户其他用户

关于- rwx rwx rwx:
-:代表这是一个普通文件,其中其他文件类型还包括了:
d--------------------->目录文件(directory)
l---------------------->链接恩建(link)
b--------------------->设备文件(block)
c---------------------->字符设备文件(character)
s---------------------->套接字文件(socket)
p---------------------->管道文件(pipe)

二目录相关

2.1 os.Create函数创建文件
func Create(name string) (file *File,err error)

Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。

实例演示:

// 创建文件
func createFile() {
    f, err := os.Create("test.txt")
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("f: %v\n", f)
    }
}
2.2 创建目录
2.2.1 os.Mkdir 函数创建单个目录
func Mkdir(name string,perm FileMode) error{}

只能创建单个目录,不能创建多级目录

实例演示:

func createDir1() {
    err := os.Mkdir("test", os.ModePerm)
    if err != nil {
        fmt.Printf("err: %v\n", err)
	} 
}
2.2.2 os.MkdirAll 函数创建多级目录
func MkdirAll(path string ,perm FileMode) error{}

实例演示:

func createDir2() {
    err := os.MkdirAll("test/a/b", os.ModePerm)
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
}
2.3 删除目录
2.3.1 os.Remove 函数只能删除一个空的目录活一个文件
func Remove(name string) error{}

实例演示:

func removeDir1() {
	err := os.Remove("test.txt")
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
}
os.RemoveAll函数可以强制删除目录以及目录汇中的文件
func RemoveAll(path string) error{
	retuen removeAll(path)
}

实例演示:

func removeDir2() {
    err := os.RemoveAll("test")
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
}
2.4 os.Getwd函数获得工作目录
func Getwd() (dir string,err error){}

实例演示:

func getWd() {
    dir, err := os.Getwd()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("dir: %v\n", dir)
    }
}
2.5 os.Chdir函数修改工作目录
func (f *File) Chdir() error

改变工作目录到f,其中f必须为一个目录,否则便会报错

实例演示:

func chWd() {
    err := os.Chdir("d:/")
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
    fmt.Println(os.Getwd())
}
2.6 os.TempDir获得临时目录
func TempDir() string{
	return tempDir
}

实例演示:

func getTemp() {
    s := os.TempDir()
    fmt.Printf("s: %v\n", s)
}
2.7 os.Rename重命名文件
func Rename(olapath , newpath string)error{
	return rename(oldpath,newpath)
}

实例演示:

func renameFile() {
    err := os.Rename("test.txt", "test2.txt")
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
}
2.8 os.Chmod函数修改文件权限
func Chmod(name string,mode FileMode) error {
	return chmod(name,mode)
}
2.9 os.Chown函数修改文件所有者
func Chown(name string ,uid,gid int) error {}

三 文件打开与关闭

3.1文件打开模式
const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)
3.2 文件打开与关闭操作
func Create(name string) (file *File, err error) // 创建一个空文件,注意当文件已经存在时,会直接覆盖掉原文件,不会报错

func Open(name string) (file *File, err error) // 打开一个文件,注意打开的文件只能读,不能写

func OpenFile(name string, flag int, perm FileMode) (file *File, err error) // 以指定的权限打开文件

func (f *File) Close() error // 关闭文件,关闭后不可读写

其实os.Create等价于: OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)

实例演示:

package main

import (
	"fmt"
	"os"
)

func openCloseFile() {
	// 只能读
	f, _ := os.Open("a.txt")
	fmt.Printf("f.Name(): %v\n", f.Name())
	// 根据第二个文件打开模式参数 可以指定权限为读写或者创建
	f2, _ := os.OpenFile("a1.txt", os.O_RDWR|os.O_CREATE, 0755)
	fmt.Printf("f2.Name(): %v\n", f2.Name())

	err := f.Close()
	fmt.Printf("err: %v\n", err)
	err2 := f2.Close()
	fmt.Printf("err2: %v\n", err2)
}

func main() {
	openCloseFile()
}

File文件读操作

func (f *File) Stat() (fi FileInfo,err error) //获取文件的信息,里面有文件的名称,大小,修改时间等

func (f *File) Read(b []byte) (n int,err error) //从文件中一次性读取b大小的数据,当读到文件结尾时,返回EOF错误 

func (f *File) ReadAt(b []byte,off int64) (n int, err error)//从文件中指定的位置(off)一次性读取b大小的数据

func ReadDir(name string) ([]DirEntry,error) //读取目录并返回排序好的文件以及子目录名切片

func (f *File) Seek(offset int64,whence int) (ret int64,err error)
//Seek设置下次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
4.1 f.Read()
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	f, _ := os.Open("a.txt")
	for {
		buf := make([]byte, 4) // 设置一个缓冲区,一次读4个字节
		n, err := f.Read(buf)  // 将读到的内容放入缓冲区内
		fmt.Printf("string(buf): %v\n", string(buf))
		fmt.Printf("n: %v\n", n)
		if err == io.EOF { // EOF表示文件读取完毕
			break
		}
	}
	f.Close()
}

4.1 f.ReadAt()
package main

import (
	"fmt"
	"os"
)

func main() {
	buf := make([]byte, 10)
	f2, _ := os.Open("a.txt")
	// 从5开始读10个字节
	n, _ := f2.ReadAt(buf, 5)
	fmt.Printf("n: %v\n", n)
	fmt.Printf("string(buf): %v\n", string(buf))
	f2.Close()
}
4.3 f.ReadDir
package main

import (
	"fmt"
	"os"
)

func main() {
	// 测试 a目录下有b和c目录
	f, _ := os.Open("a")
	de, _ := f.ReadDir(-1) // 返回一个切片de
	for _, v := range de {
		fmt.Printf("v.IsDir(): %v\n", v.IsDir())
		fmt.Printf("v.Name(): %v\n", v.Name())
	}
}
4.4 f.Seek()
package main

import (
	"fmt"
	"os"
)

func main() {
	f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头
	f.Seek(3, 0) // 从索引值为3处开始读
	buf := make([]byte, 10) // 设置缓冲区
	n, _ := f.Read(buf) // 将内容读到缓冲区内
	fmt.Printf("n: %v\n", n)
	fmt.Printf("string(buf): %v\n", string(buf))
	f.Close()
}
4.5 f.Stat()
package main

import (
	"fmt"
	"os"
)

func main() {
	f, _ := os.Open("a.txt") // 打开文件后,光标默认在文件开头
	fInfo, _ := f.Stat()
	fmt.Printf("f是否是一个文件: %v\n", fInfo.IsDir())
	fmt.Printf("f文件的修改时间: %v\n", fInfo.ModTime().String())
	fmt.Printf("f文件的名称: %v\n", fInfo.Name())
	fmt.Printf("f文件的大小: %v\n", fInfo.Size())
	fmt.Printf("f文件的权限: %v\n", fInfo.Mode().String())
}

五 File文件写操作

func (f *File) Write(b []byte) (n int, err error)
//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (f *File) WriteString(s string) (ret int,err error)
//WriteString类似Write,但接受一个字符串参数

func (f *File) WriteAt(b []byte,off int64) (n int , err error)
// WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法返回一个非nil的错误。
5.1 f.Write()
package main

import (
	"os"
)

func main() {
	f, _ := os.OpenFile("a.txt", os.O_RDWR|os.O_APPEND, 0775) // 以读写模式打开文件,并且在写操作时将数据附加到文件尾部
	f.Write([]byte(" hello golang"))
	f.Close()
}

5.3 f.WriteAt()
package main

import (
	"os"
)

func main() {
	f, _ := os.OpenFile("a.txt", os.O_RDWR, 0775) // 以读写模式打开文件
	f.WriteAt([]byte("aaa"), 3) // 从索引值为3的地方开始写入aaa并覆盖原来当前位置的数据
	f.Close()
}

六 进程相关操作(了解)

func Exit(code int) // 让当前程序以给出的状态码(code)退出。一般来说,状态码0表示成功,非0表示出错。程序会立刻终止,defer的函数不会被执行。

func Getuid() int // 获取调用者的用户id

func Geteuid() int // 获取调用者的有效用户id

func Getgid() int // 获取调用者的组id

func Getegid() int // 获取调用者的有效组id

func Getgroups() ([]int, error) // 获取调用者所在的所有组的组id

func Getpid() int // 获取调用者所在进程的进程id

func Getppid() int // 获取调用者所在进程的父进程的进程id

七 环境相关操作(了解)

unc Hostname() (name string, err error) // 获取主机名

func Getenv(key string) string // 获取某个环境变量

func Setenv(key, value string) error // 设置一个环境变量,失败返回错误,经测试当前设置的环境变量只在 当前进程有效(当前进程衍生的所以的go程都可以拿到,子go程与父go程的环境变量可以互相获取);进程退出消失

func Clearenv() // 删除当前程序已有的所有环境变量。不会影响当前电脑系统的环境变量,这些环境变量都是对当前go程序而言的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GoLang学习笔记主要括以下几个方面: 1. 语法规则:Go语言要求按照语法规则编写代码,例如变量声明、函数定义、控制结构等。如果程序中违反了语法规则,编译器会报错。 2. 注释:Go语言中的注释有两种形式,分别是行注释和块注释。行注释使用`//`开头,块注释使用`/*`开头,`*/`结尾。注释可以提高代码的可读性。 3. 规范代码的使用:括正确的缩进和空白、注释风格、运算符两边加空格等。同时,Go语言的代码风格推荐使用行注释进行注释整个方法和语句。 4. 常用数据结构:如数组、切片、字符串、映射(map)等。可以使用for range遍历这些数据结构。 5. 循环结构:Go语言支持常见的循环结构,如for循环、while循环等。 6. 函数:Go语言中的函数使用`func`关键字定义,可以有参数和返回值。函数可以提高代码的重用性。 7. 指针:Go语言中的指针是一种特殊的变量,它存储的是另一个变量的内存地址。指针可以实现动态内存分配和引用类型。 8. 并发编程:Go语言提供了goroutine和channel两个并发编程的基本单位,可以方便地实现多线程和高并发程序。 9. 标准库Go语言提供了丰富的标准库,涵盖了网络编程、文件操作、加密解密等多个领域,可以帮助开发者快速实现各种功能。 10. 错误处理:Go语言中的错误处理使用`defer`和`panic`两个关键字实现,可以有效地处理程序运行过程中出现的错误。 通过以上内容的学习,可以掌握Go语言的基本语法和编程思想,为进一步学习和应用Go语言打下坚实的基础。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Golang学习笔记](https://blog.csdn.net/weixin_52310067/article/details/129467041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [golang学习笔记](https://blog.csdn.net/qq_44336275/article/details/111143767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值