Files and Directories

基本文件读取

content, err := os.ReadFile("/tmp/dat")
if err != nil {
	panic(err)
}
fmt.Println(string(content))

先在/tmp/dat文件中写入以下内容:

寻寻觅觅,冷冷清清,凄凄惨惨戚戚。
乍暖还寒时候,最难将息。
三杯两盏淡酒,怎敌他、晚来风急?
雁过也,正伤心,却是旧时相识。

执行代码,命令行打印以下内容:

寻寻觅觅,冷冷清清,凄凄惨惨戚戚。
乍暖还寒时候,最难将息。
三杯两盏淡酒,怎敌他、晚来风急?
雁过也,正伤心,却是旧时相识。

读取指定数量的字节

f, err := os.Open("/tmp/dat")
if err != nil {
	panic(err)
}
b := make([]byte, 12)
n, err := f.Read(b)
if err != nil {
	panic(err)
}
fmt.Printf("%d bytes: %s\n", n, string(b[:n]))
f.Close()

12 bytes: 寻寻觅觅

指定位置读取指定数量的字节

f, err := os.Open("/tmp/dat")
if err != nil {
	panic(err)
}
o, err := f.Seek(15, 0)
if err != nil {
	panic(err)
}
b := make([]byte, 12)
n, err := f.Read(b)
if err != nil {
	panic(err)
}
fmt.Printf("%d bytes at %d: %s\n", n2, o2, string(b2[:n2]))
f.Close()

12 bytes at 15: 冷冷清清

更可靠的实现该功能的代码如下:

f, err := os.Open("/tmp/dat")
if err != nil {
	panic(err)
}
o, err := f.Seek(30, 0)
if err != nil {
	panic(err)
}
b := make([]byte, 18)
n, err := io.ReadAtLeast(f, b, 18)
if err != nil {
	panic(err)
}
fmt.Printf("%d bytes at %d: %s\n", n3, o3, string(b3))
f.Close()

18 bytes at 30: 凄凄惨惨戚戚

bufio实现文件读取

f, err := os.Open("/tmp/dat")
if err != nil {
	panic(err)
}
r := bufio.NewReader(f)
b, err := r.Peek(51)
if err != nil {
	panic(err)
}
fmt.Printf("51 bytes: %s\n", string(b))
f.Close()

51 bytes: 寻寻觅觅,冷冷清清,凄凄惨惨戚戚。

基本文件写入

d := []byte("hello\ngo")
err := os.WriteFile("/tmp/dat", d, 0644)
if err != nil {
	panic(err)
}

打开文件/tmp/dat,可以看到文件内容:

hello
go

文件写入字节数组

f, err := os.Create("/tmp/dat")
if err != nil {
	panic(err)
}
defer f.Close()
b := []byte{115, 111, 109, 101, 10}
n, err := f.Write(b)
if err != nil {
	panic(err)
}
fmt.Printf("wrote %d bytes\n", n)
f.Sync()

wrote 5 bytes

打开文件/tmp/dat,可以看到以下内容:

some

文件写入字符串

f, err := os.Create("/tmp/dat")
if err != nil {
	panic(err)
}
defer f.Close()
n, err := f.WriteString("writes\n")
if err != nil {
	panic(err)
}
fmt.Printf("wrote %d bytes\n", n)
f.Sync()

wrote 7 bytes

打开文件/tmp/dat,可以看到以下内容:

writes

bufio实现文件写入

f, err := os.Create("/tmp/dat2")
if err != nil {
	panic(err)
}
defer f.Close()
w := bufio.NewWriter(f)
n, err := w.WriteString("buffered\n")
if err != nil {
	panic(err)
}
fmt.Printf("wrote %d bytes\n", n)
w.Flush()

wrote 9 bytes

打开文件/tmp/dat,可以看到以下内容:

buffered

逐行读取

f, err := os.Open("/tmp/dat")
if err != nil {
	panic(err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
	ucl := strings.ToUpper(scanner.Text())
	fmt.Println(ucl)
}
if err := scanner.Err(); err != nil {
	fmt.Fprintln(os.Stderr, "error:", err)
	os.Exit(1)
}

首先创建文件/tmp/dat并输入以下内容:

Rain is falling all around,
It falls on field and tree,
It rains on the umbrella here,
And on the ships at sea.

运行代码,命令行输出以下内容:

RAIN IS FALLING ALL AROUND,
IT FALLS ON FIELD AND TREE,
IT RAINS ON THE UMBRELLA HERE,
AND ON THE SHIPS AT SEA.

如果需要根据命令行输入的内容,输出转换后的字符串,可以这样实现:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
	ucl := strings.ToUpper(scanner.Text())
	fmt.Println(ucl)
}
if err := scanner.Err(); err != nil {
	fmt.Fprintln(os.Stderr, "error:", err)
	os.Exit(1)
}

Rain is falling all around,
RAIN IS FALLING ALL AROUND,
It falls on field and tree,
IT FALLS ON FIELD AND TREE,
It rains on the umbrella here,
IT RAINS ON THE UMBRELLA HERE,
And on the ships at sea.
AND ON THE SHIPS AT SEA.

文件路径拼接

path := filepath.Join(string(filepath.Separator), "etc", "apache2", "httpd.conf")
fmt.Println("path:", path)

path: /etc/apache2/httpd.conf

文件路径拼接方法会自动简化路径字符串:

fmt.Println(filepath.Join("/etc//apache2", "httpd.conf"))
fmt.Println(filepath.Join("/etc/apache2/original/..", "httpd.conf"))

/etc/apache2/httpd.conf
/etc/apache2/httpd.conf

文件路径解析

path = "/etc/apache2/httpd.conf"
fmt.Println("dir:", filepath.Dir(path))
base := filepath.Base(path)
fmt.Println("base:", base)
ext := filepath.Ext(path)
fmt.Println("ext:", ext)
fmt.Println("file:", strings.TrimSuffix(base, ext))

dir: /etc/apache2
base: httpd.conf
ext: .conf
file: httpd

文件路径是否为绝对路径

fmt.Println(filepath.IsAbs("etc/apache2/httpd.conf"))
fmt.Println(filepath.IsAbs("/etc/apache2/httpd.conf"))

false
true

相对路径计算

rel, err := filepath.Rel("a/b", "a/b/t/file")
if err != nil {
	panic(err)
}
fmt.Println(rel)
rel, err = filepath.Rel("a/b", "a/c/t/file")
if err != nil {
	panic(err)
}
fmt.Println(rel)
t/file
../c/t/file

创建文件夹

err := os.Mkdir("subdir", 0755)
if err != nil {
	panic(err)
}
defer os.RemoveAll("subdir")

当前go文件所在目录下,会出现名为subdir的文件夹,并在代码执行结束时,subdir文件夹会被删除。

创建文件夹及子文件夹

err = os.MkdirAll("subdir/parent/child", 0755)
if err != nil {
	panic(err)
}
defer os.RemoveAll("subdir")

当前go文件所在目录下,会分别出现subdir/parent/child文件夹,后者是前者的子文件夹。在代码执行结束时,subdir文件夹会被删除。

遍历文件夹

dirs, err := os.ReadDir("/usr")
if err != nil {
	panic(err)
}
for _, entry := range dirs {
	fmt.Println(entry.Name(), entry.IsDir())
}

X11 false
X11R6 false
bin true
lib true
libexec true
local true
sbin true
share true
standalone true

通过Chdir也可以遍历当前文件夹

err = os.Chdir("/usr/local")
if err != nil {
	panic(err)
}
dirs, err = os.ReadDir(".")
if err != nil {
	panic(err)
}
for _, entry := range dirs {
	fmt.Println(entry.Name(), entry.IsDir())
}

Caskroom true
Cellar true
Frameworks true
Homebrew true
bin true
etc true
go true
include true
lib true
mysql false
mysql-8.0.23-macos10.15-x86_64 true
opt true
sbin true
share true
var true

自定义方法遍历文件夹

func walkFunc(p string, info os.FileInfo, err error) error {
	if err != nil {
		return err
	}
	fmt.Println(p, info.IsDir())
	return nil
}
err = filepath.Walk("/etc/apache2/original", walkFunc)
if err != nil {
	panic(err)
}

/etc/apache2/original true
/etc/apache2/original/extra true
/etc/apache2/original/extra/httpd-autoindex.conf false
/etc/apache2/original/extra/httpd-dav.conf false
/etc/apache2/original/extra/httpd-default.conf false
/etc/apache2/original/extra/httpd-info.conf false
/etc/apache2/original/extra/httpd-languages.conf false
/etc/apache2/original/extra/httpd-manual.conf false
/etc/apache2/original/extra/httpd-mpm.conf false
/etc/apache2/original/extra/httpd-multilang-errordoc.conf false
/etc/apache2/original/extra/httpd-ssl.conf false
/etc/apache2/original/extra/httpd-userdir.conf false
/etc/apache2/original/extra/httpd-vhosts.conf false
/etc/apache2/original/extra/proxy-html.conf false
/etc/apache2/original/httpd.conf false

创建临时文件

f, err := os.CreateTemp("", "sample")
if err != nil {
	panic(err)
}
defer os.Remove(f.Name())
fmt.Println("Temp file name:", f.Name())
_, err = f.Write([]byte{'1', '2', '3', '4'})
if err != nil {
	panic(err)
}

Temp file name: /var/folders/f3/9bv010c50l1fhnv0y3bkrdp40000gn/T/sample628114842

程序运行期间,临时文件会被创建,并被写入多个字节。代码执行结束,临时文件会被删除。

创建临时文件夹

d, err := os.MkdirTemp("", "sampledir")
if err != nil {
	panic(err)
}
defer os.RemoveAll(d)
fmt.Println("Temp dir name:", d)
fpath := filepath.Join(d, "file1")
err = os.WriteFile(fpath, []byte{'1', '2'}, 0666)
if err != nil {
	panic(err)
}

Temp dir name: /var/folders/f3/9bv010c50l1fhnv0y3bkrdp40000gn/T/sampledir807095762

程序运行期间,临时文件夹会被创建,其中会创建文件,并写入多个字节。代码执行结束,临时文件夹会被删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值