前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go - os包 彻头彻尾用法使用

go - os包 彻头彻尾用法使用

原创
作者头像
酷走天涯
修改于 2018-09-19 04:16:05
修改于 2018-09-19 04:16:05
4.4K0
举报

os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。例如,如果某个使用一个文件名的调用(如Open、Stat)失败了,打印错误时会包含该文件名,错误类型将为*PathError,其内部可以解包获得更多信息。

os包的接口规定为在所有操作系统中都是一致的。非公用的属性可以从操作系统特定的syscall包获取.

下面我们把os包里面的所有api进行讲解和演示

  • 1.获取当前目录
  • 2.修改当前目录
  • 3.修改文件权限
  • 4.获取用户uid 和 群组gid
  • 5.查看用户所属组的列表
  • 6.获取调用者有效的用户标识
  • 7.返回底层系统的内存页面大小
  • 8.获取主机名称
  • 9.获取当前进程id 和其父进程id
  • 10.获取文件的状态
  • 11.错误检测
  • 12.创建文件夹
  • 13.删除文件夹或者文件
  • 14.修改文件夹或者文件的名称
  • 15.移动文件夹或者文件
  • 16.新建文件
  • 17.打开文件
  • 18.写入文件
  • 19.读取文件
  • 20.删除文件或文件夹
  • 21.关闭文件
  • 22.检测文件是否是同一个
  • 23.获取文件模式相关信息
  • 24.把文件所在的目录切换为当前目录
  • 25.查看文件名称
  • 26.如何查看所有文件夹下的所有文件和文件数量
  • 27.读取文件夹的下面文件的名称
  • 28.获取临时目录的文件夹路径
  • 29.判断字符是否是支持的路径分割符
  • 30.查看环境变量
  • 31.获取文件对应的unix文件描述符
  • 32.Chown修改文件的用户ID和组ID
  • 33.强制改变文件大小
  • 34.硬链接
  • 35.同步保存当前文件的内容
  • 36.NewFile使用给出的Unix文件描述符和名称创建一个文件
  • 37.Lstat返回一个描述name指定的文件对象的FileInfo
  • 38.查看所有环境变量
  • 39.查看指定值对应的环境变量
  • 40.获取当前程序可执行的文件地址
  • 41.查找指定环境变量
  • 42.让程序已给定的状态码退出
  • 43.设置环和取消环境变量
  • 44.创建软链接
  • 45.获取软链接文件对应的实际文件路径地址
  • 46.更改指定文件的访问和修改时间
  • 47.创建文件夹,并设置权限
  • 48.设置文件的读写位置
  • 49.修改文件权限
  • 50.管道的用法
  • 51.创建系统错误
  • 52.通过pid查找进行进程
  • 53.启动一个进程
  • 54.杀死进程
  • 55.释放与进行p关联的任何资源
1.获取当前目录

func Getwd() (dir string, err error)

示例

代码语言:txt
AI代码解释
复制
func main() {
  fmt.Println(os.Getwd())
}
image.png
image.png
2.修改当前目录

func Chdir(dir string) error

代码语言:txt
AI代码解释
复制
package main
import (
  "fmt"
  "os"
)
func main() {
  fmt.Println(os.Getwd())
  os.Chdir("/Users/xujie")
  fmt.Println(os.Getwd())
}
image.png
image.png

我们通过os.Chdir("/Users/xujie")当前目录修改为/Users/xujie

我们看一个应用案例,比如我们要读取桌面上的一个文件file.txt里面的内容

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
  "log"
    "io/ioutil"
)

func main() {
  fmt.Println(os.Getwd())
  // 切换当前目录为桌面
  os.Chdir("/Users/xujie/Desktop")
  // 打开文件
  file,error := os.Open("file.txt")
  
  defer file.Close()
  if error != nil{
    log.Fatal(error)
  }
  // 读取文件
  data,_ := ioutil.ReadAll(file)
  fmt.Println(string(data))
}
image.png
image.png

注意文件操作完成后,需要调用close()方法关闭文件

3.修改文件权限

func Chmod(name string, mode FileMode) error

什么是文件或者文件夹的权限?

先使用命令行在任意目录下输入指令 ls -lih

image.png
image.png

rwxr-xr-- 中前三个字符“rwx”表示文件所属用户对该文件有读,写和运行权限;中间三个字符“r-x”表示该文件所属用户组成员对该文件有读和运行权限,没有写权限;最后三个字符“r--”表示其他用户对该文件只有读权限,没有写权限和运行权限。

第一字段:inode

第二字段:第一个字符表示文件类型,后面9个字符表示文件权限;

第三字段: 硬链接个数;

第四字段: 属主;

第五字段:所归属的组;

第六字段:文件或目录的大小;

第七字段和第八字段:最后访问或修改时间;

第九字段:文件名或目录名

第二个字段 还包含 SUID, SGID, SBIT 权限

SUID

当 s 这个标志出现在文件拥有者的 x 权限上时,如上 /usr/bin/passwd 这个文件的权限状态,此时就被称为 Set UID,简称为 SUID 的特殊权限。基本上SUID有这样的限制与功能:

代码语言:txt
AI代码解释
复制
SUID 权限仅对二进位程序(binary program)有效(不能够用在 shell script 上面)
代码语言:txt
AI代码解释
复制
运行者对於该程序需要具有 x 的可运行权限
代码语言:txt
AI代码解释
复制
本权限仅在运行该程序的过程中有效 (run-time)
代码语言:txt
AI代码解释
复制
运行者将具有该程序拥有者 (owner) 的权限

SGID:

与 SUID 不同的是,SGID 可以针对文件或目录来配置!

如果是对文件来说, SGID 有如下的功能:

代码语言:txt
AI代码解释
复制
SGID 对二进位程序有用,程序运行者对於该程序来说,需具备 x 的权限
代码语言:txt
AI代码解释
复制
运行者在运行的过程中将会获得该程序群组的权限

如果针对的是目录,SGID 有如下的功能:

代码语言:txt
AI代码解释
复制
使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
代码语言:txt
AI代码解释
复制
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;

Sticky Bit:

这个 Sticky Bit, SBIT 目前只针对目录有效作用是:

代码语言:txt
AI代码解释
复制
当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
代码语言:txt
AI代码解释
复制
当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

chmod :改变文件的权限, SUID, SGID, SBIT等等的特性

1.数字类型改变文件权限

各权限的分数对照表如下:

代码语言:txt
AI代码解释
复制
    SUID:   4
代码语言:txt
AI代码解释
复制
    SGID:   2
代码语言:txt
AI代码解释
复制
    SBIT:   1
代码语言:txt
AI代码解释
复制
    r:      4
代码语言:txt
AI代码解释
复制
    w:      2
代码语言:txt
AI代码解释
复制
    x:      1

每种身份特殊权限(SUID/SGID/SBIT)和(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的

代码语言:txt
AI代码解释
复制
例如当权限为: [-rwxrwx---] 分数则是:
代码语言:txt
AI代码解释
复制
owner = rwx = 4+2+1 = 7
代码语言:txt
AI代码解释
复制
group = rwx = 4+2+1 = 7
代码语言:txt
AI代码解释
复制
others= --- = 0+0+0 = 0
代码语言:txt
AI代码解释
复制
例如当权限为: [-rwsr-sr-x] 分数则是:
代码语言:txt
AI代码解释
复制
特殊权限 = SUID&&SGID = 4+2 = 6
代码语言:txt
AI代码解释
复制
owner = rws = 4+2+1 = 7
代码语言:txt
AI代码解释
复制
group = r-s = 4+1 = 5
代码语言:txt
AI代码解释
复制
others= r-x = 4+1 = 5

我们试着将刚才的目录修改为不可读

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
    )

func main() {
  fmt.Println(os.Getwd())
  os.Chdir("/Users/xujie/Desktop")
  os.Chmod("file.txt",0)
}

当我们再次打开文件时,提示不可读

image.png
image.png

我们想要可读可写,只要把文件的权限打开即可如下

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )

func main() {
  fmt.Println(os.Getwd())
  os.Chdir("/Users/xujie/Desktop")
  os.Chmod("file.txt",0777)
}
4.获取用户识别码uid 和 群组识别码gid
代码语言:txt
AI代码解释
复制
func Getuid()  int 
func Getgid()  int  // 有效的用户识别码
func Geteuid() int  // 有效的群组识别码
func Getgid()  int 

示例代码

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
  )

func main() {
  fmt.Println(os.Getwd())
  os.Chdir("/Users/xujie/Desktop")
  fmt.Println(os.Getuid())
  println(os.Getgid())
}
image.png
image.png

5.查看用户所属组的列表

func Getgroups() ([]int, error)

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )

func main() {
  fmt.Println(os.Getgroups())
}
image.png
image.png

6. 获取调用者有效的用户标识

返回调用者的数字有效用户标识

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )

func main() {
  fmt.Println(os.Geteuid())
}
image.png
image.png

7.返回底层系统的内存页面大小

func Getpagesize() int

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )

func main() {
  fmt.Println(os.Getpagesize())
}
image.png
image.png

8.获取主机名称

func Hostname() (name string, err error)

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )
func main() {
  fmt.Println(os.Hostname())
}
image.png
image.png

9.获取当前进程id 和其父进程id

func Getpid() 获取当前进程id

func Getppid() 获取父进程id

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
      )

func main() {
  fmt.Println(os.Getpid())
  fmt.Println(os.Getppid())
}
image.png
image.png

10.获取文件的状态

`

func Stat(name string) (FileInfo, error)

`

代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
)

func main() {
  filename := "/Users/xujie/Desktop/file.txt"
  file,_:=os.Stat(filename)
  fmt.Println(file.Name())
  fmt.Println(file.IsDir())
  fmt.Println(file.Size())
  fmt.Println(file.Mode())
  fmt.Println(file.Sys())
}
image.png
image.png

11.错误检测
代码语言:txt
AI代码解释
复制
func IsExist(err error) bool // 文件存在,但是由系统产生错误
func IsNotExist(err error) bool // 目录或者文件不存在时返回true
func IsPermission(err error)bool // 检测是不是由于权限不足导致的错误
代码语言:txt
AI代码解释
复制
package main

import (
  "fmt"
  "os"
)

func main() {
  filename := "file.txt"
  _, err := os.Stat(filename);
  fmt.Println(os.IsExist(err))
  fmt.Println(os.IsNotExist(err))
}
image.png
image.png

我们把文件file.txt 的权限修改为只读的,执行下面的代码

image.png
image.png
代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
)

func main() {
  os.Chdir("/Users/xujie/Desktop")
  file,error := os.OpenFile("file.txt",os.O_RDWR,0444)
  if error != nil {
    fmt.Println(os.IsPermission(error))
    fmt.Println(os.IsPermission(error))
    return
  }
  _,error = file.WriteString("neirong")
   if error != nil {
     fmt.Println(error)
     fmt.Println(os.IsPermission(error))
   }
}
image.png
image.png

12.创建文件夹

func Mkdir(name string, perm FileMode) error

示例

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 error := os.Mkdir("go_demo",0777)
 if error != nil{
   fmt.Println(error)
 }
}
image.png
image.png

如果我们再次运行这个程序,会发生什么?

image.png
image.png
13.删除文件夹或者文件

func Remove(name string) error

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 移除文件夹
 error := os.Remove("go_demo")
 if error != nil{
   fmt.Println(error)
 }
}
14.修改文件夹或者文件的名称

func Rename(oldpath, newpath string) error

示例

代码语言:txt
AI代码解释
复制
package main
import (
    "os"
  "fmt"
)
func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 error := os.Rename("go_demo","new_demo_go")
 if error != nil{
   fmt.Println(error)
 }
}
image.png
image.png
15.移动文件夹或者文件

func Rename(oldpath, newpath string) error

和14用的是同一个方法

代码语言:txt
AI代码解释
复制
package main
import (
    "os"
  "fmt"
)
func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 error := os.Rename("new_demo_go","/Users/xujie/Desktop/未命名文件夹/new_demo_go")
 if error != nil{
   fmt.Println(error)
 }
}
image.png
image.png
16.新建文件

func Create(name string) (*File, error)

这个方法创建文件是默认的权限为0666,如果已经存在同名的文件,则调用此方法,会覆盖掉原来的文件

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)
func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 file,error := os.Create("file.txt")
 if error != nil{
   fmt.Println(error)
 }
 fmt.Println(file)
}
17.打开文件

func Open(name string) (*File, error)

示例

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 file,error:= os.Open("file.txt")
 if error != nil {
   fmt.Println(error)
 }
 fmt.Println(file)
}
image.png
image.png

如果打开的文件不存在,则会返回错误 open file1.txt: no such file or directory

18.写入文件
代码语言:txt
AI代码解释
复制
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func (f *File) WriteString(s string) (n int, err error)
代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 file,error:= os.Open("file2.txt")
 if error != nil {
   fmt.Println(error)
 }
 _,error = file.WriteString("你好")
  fmt.Println(error)
}
image.png
image.png

为什么会报错?

我们先看一下open方法 `func Open(name string) (*File, error) {

代码语言:txt
AI代码解释
复制
return OpenFile(name, O_RDONLY, 0) 

}`参数传递的是只读的,所以我们写入不成功,这里我们需要用到下面一个方法

func OpenFile(name string, flag int, perm FileMode) (*File, error)

第二个参数

O_RDONLY 打开只读文件

O_WRONLY 打开只写文件

O_RDWR 打开既可以读取又可以写入文件

O_APPEND 写入文件时将数据追加到文件尾部

O_CREATE 如果文件不存在,则创建一个新的文件

O_EXCL 文件必须不存在,然后会创建一个新的文件

O_SYNC 打开同步I/0

O_TRUNC 文件打开时可以截断

第三个参数就是权限模式

下面我们看下面的例子

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 file,error:= os.OpenFile("file.txt",os.O_RDWR,0666)
 defer file.Close()
 if error != nil {
   fmt.Println(error)
 }
 _,error = file.WriteString("你好")
  _,error = file.WriteString("从天有一个书")
  fmt.Println(error)
}
image.png
image.png

这样就完成了文件的写入,我们发现文件原来的内容已经被替换掉了,如果我们只想向文件中追加部分内容该如何实现?

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
  // 创建一个文件夹
 file,error:= os.OpenFile("file.txt",os.O_RDWR|os.O_APPEND,0666)
 defer file.Close()
 if error != nil {
   fmt.Println(error)
 }
 _,error = file.WriteString("\n---酷走天涯")
  fmt.Println(error)
}
image.png
image.png

19.读取文件

示例

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
 file,error:= os.Open("file.txt")

 defer file.Close()
 if error != nil {
   fmt.Println(error)
   return
 }
  fileInfo,_ := file.Stat()
  fmt.Println(fileInfo.Size())
  
  // 创建缓冲区
 data := make([]byte,fileInfo.Size())
 // 一次性读取所有内容到缓冲区中
 _,error = file.Read(data)

  fmt.Println(error)
 fmt.Println(string(data))
}
image.png
image.png

那么如何多次读取文件里面的内容呢?

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  // 进入桌面目录
  os.Chdir("/Users/xujie/Desktop")
 file,error:= os.Open("file.txt")

 defer file.Close()
 if error != nil {
   fmt.Println(error)
   return
 }
  fileInfo,_ := file.Stat()
  fmt.Println(fileInfo.Size())

  // 创建缓冲区
  var max = 3
  var offset int64 = 0
  data := make([]byte,max)
 // 多次读取缓冲区内容

 for {
   _,error = file.ReadAt(data,offset)
   if error != nil {
     fmt.Println(error)
     break;
   }
   offset += 3
   fmt.Println(string(data))

 }
image.png
image.png
20.删除文件

func Remove(name string) error

代码语言:txt
AI代码解释
复制
package main

import (
    "os"
  "fmt"
)

func main() {
  error := os.Remove("/Users/xujie/Desktop/file.txt")
  if error != nil{
    fmt.Println(error)
  }
  fmt.Println("删除成功")

}
image.png
image.png

通过上面的代码就删除了指定的文件,如果你删除一个空的文件夹也可使用这个方法,如果需要删除指定目录下面的所有文件呢?

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  error := os.RemoveAll("/Users/xujie/Desktop/未命名文件夹")
  if error != nil{
    fmt.Println(error)
  }
  fmt.Println("删除成功")
}
21.关闭文件

func (f *File) Close() error

文件操作完毕后,需要调用此方法进行i/o

22.检测文件是否是同一个

func SameFile(fi1, fi2 FileInfo) bool

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  fileInfo1,_:= os.Stat("/Users/xujie/Desktop/DataParser.zip")
  fileInfo2,_:= os.Stat("/Users/xujie/Downloads/DataParser.zip")
  fmt.Println(fileInfo1)
  fmt.Println(fileInfo2)
  fmt.Println(os.SameFile(fileInfo1,fileInfo2))
}
image.png
image.png

就算是同一个文件,没在同一个路径下也会返回false,判断依据如下

这意味着两个基础结构的 inode 字段是相同的

23.获取文件模式相关信息
代码语言:txt
AI代码解释
复制
func (m FileMode) IsDir() bool
func (m FileMode) IsRegular() bool
func (m FileMode) Perm() FileMode
func (m FileMode) String() string
代码语言:txt
AI代码解释
复制
package main

import (
"os"
"fmt"
)

func main() {
  fileInfo1,_:= os.Stat("/Users/xujie/Desktop/DataParser.zip")
  fmt.Println(fileInfo1.Mode().String())
  fmt.Println(fileInfo1.Mode().IsRegular())
  fmt.Println(fileInfo1.Mode().IsDir())
  fmt.Println(fileInfo1.Mode().Perm())
}
image.png
image.png

24.把文件所在的目录切换为当前目录

func (f *File) Chdir() error

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
)

func main() {
  fmt.Println(os.Getwd())
  os.Chdir("/Users/xujie/Desktop")
  file,_ := os.OpenFile("file.txt",os.O_RDWR,0444)
  file.Chdir()
  fmt.Println(os.Getwd())
}
image.png
image.png

我们发现当前目录从/Users/xujie/go/src/awesomeProject <nil>切换到了 /Users/xujie/Desktop


25.查看文件名称

func (f *File) Name() string

示例

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
)

func main() {

  os.Chdir("/Users/xujie/Desktop")
  file,_ := os.Open("file.txt")
  fmt.Println(file.Name())
}
image.png
image.png
26.如何查看所有文件夹下的所有文件和文件数量

func (f *File) Readdir(n int) ([]FileInfo, error)

n 表示读取目录下文件的最大数量,n < 0 表示全部

代码语言:txt
AI代码解释
复制
package main
import (
  "os"
    "fmt"
)
func main() {
  file,_ := os.Open("/Users/xujie/Desktop/未命名文件夹")
  files,_ := file.Readdir(10)
  for _,f := range  files {
    fmt.Println(f.Name())
  }
}
27.读取文件夹的下面文件的名称

func (f *File) Readdirnames(n int) (names []string, err error)

示例

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
)

func main() {
  file,_ := os.Open("/Users/xujie/Desktop/未命名文件夹")
  fileNames,_ := file.Readdirnames(-1)
  for _,name := range  fileNames {
    fmt.Println(name)
  }
}
image.png
image.png

28.获取临时目录的文件夹路径

func TempDir() string

代码语言:txt
AI代码解释
复制
package main
import (
  "os"
  "fmt"
)

func main() {
  dir := os.TempDir()
  fmt.Println(dir)
}
image.png
image.png

29.判断字符是否是支持的路径分割符

func IsPathSeparator(c uint8) bool

代码语言:txt
AI代码解释
复制
package main

import (
    "fmt"
  "os"
)

func main() {
 fmt.Println(os.IsPathSeparator('c'))
  fmt.Println(os.IsPathSeparator('\\'))
  fmt.Println(os.IsPathSeparator('/'))
}
image.png
image.png

30.查看环境变量

func Getenv(key string) string

代码语言:txt
AI代码解释
复制
package main

import (
"fmt"
"os"
)

func main() {
  fmt.Println(os.Getenv("GOPATH"))
  fmt.Println(os.Getenv("GOROOT"))
}
image.png
image.png

31.获取文件对应的unix文件描述符

func (f *File) Fd() uintptr

代码语言:txt
AI代码解释
复制
package main

import (
"fmt"
"os"
)

func main() {
  file,_:= os.Open("/Users/xujie/Desktop")
  fmt.Println(file.Fd())

  file,_= os.Open("/Users/xujie/Desktop/未命名文件夹")
  fmt.Println(file.Fd())
  // 如果文件关闭,将不能获取正确的文件描述符
  file.Close()

  fmt.Println(file.Fd())

}
image.png
image.png

32.Chown修改文件的用户ID和组ID

func Chown(name string, uid, gid int) error

32.修改文件权限

func (f *File) Chmod(mode FileMode) error

代码语言:txt
AI代码解释
复制
package main

import (
"os"
  "fmt"
)

func main() {
  file,_:= os.OpenFile("/Users/xujie/Desktop/file.txt",os.O_RDWR|os.O_APPEND,777)
  fileInfo,_ := file.Stat()
  fmt.Println(fileInfo.Mode())

  err := file.Chmod(0444)
  if err != nil{
    fmt.Println(err)
  }
  fileInfo,_ = file.Stat()
  fmt.Println(fileInfo.Mode())

}
image.png
image.png
33.强制改变文件大小

两个方法如下

func Truncate(name string, size int64) error

func (f *File)Truncate(size int64) error

image.png
image.png
代码语言:txt
AI代码解释
复制
package main

import (
"os"
  "fmt"
)

func main() {
  file,_:= os.OpenFile("/Users/xujie/Desktop/file.txt",os.O_RDWR|os.O_APPEND,777)
  fileInfo,_ := file.Stat()
  fmt.Println(fileInfo.Size())
  error := file.Truncate(3)
  if error != nil {
   fmt.Println(error)
  }
  fileInfo,_ = file.Stat()
  fmt.Println(fileInfo.Size())
}
image.png
image.png

代码执行后

image.png
image.png
34.链接 硬链接

硬链接(hard link, 也称链接)就是一个文件的一个或多个文件名。再说白点,所谓链接无非是把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录

func Link(oldname, newname string) error

代码语言:txt
AI代码解释
复制
package main
import (
"os"
  "fmt"
)
func main() {
  file,error := os.Open("/Users/xujie/Desktop/file.txt")
  if error != nil{
    fmt.Println(error)
  }
  error = os.Link(file.Name(),"/Users/xujie/Desktop/bb.txt")
  if error != nil {
    fmt.Println(error)
  }
}

这个时候就会在桌面生成一个file.txt文件的副本

image.png
image.png
35.同步保存当前文件的内容

func (f *File) Sync() error

Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  file,error := os.OpenFile("/Users/xujie/Desktop/file.txt",os.O_RDWR,0777)
  if error != nil{
   fmt.Println(error)
  }
  file.WriteString("新内容")
  file.Sync()
}
36.NewFile使用给出的Unix文件描述符和名称创建一个文件

func NewFile(fd uintptr, name string) *File

示例如下

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  file,error := os.OpenFile("/Users/xujie/Desktop/file.txt",os.O_RDWR,0777)
  if error != nil{
   fmt.Println(error)
  }
  file = os.NewFile(file.Fd(),"/Users/xujie/Desktop/hahha.txt")
  file.WriteString("dddddd")
}

此时你会发现文件file.txt 里面的内容已经被修改为ddddd


37.Lstat返回一个描述name指定的文件对象的FileInfo

func Lstat(name string) (fi FileInfo, err error)

Lstat返回一个描述name指定的文件对象的FileInfo。如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接的信息,本函数不会试图跳转该链接。如果出错,返回的错误值为*PathError类型

代码语言:txt
AI代码解释
复制
package main

import (
"os"
"fmt"
)

func main() {

 fileInfo,_ :=  os.Lstat("/Users/xujie/Desktop/file.txt")
 fmt.Println(fileInfo.Name())
 fmt.Println(fileInfo.Size())
 fmt.Println(fileInfo.IsDir())
}
image.png
image.png
38.查看所有环境变量

func Environ() []string

Environ返回表示环境变量的格式为"key=value"的字符串的切片拷贝

代码语言:txt
AI代码解释
复制
package main

import (
"os"
"fmt"
)

func main() {

 envs :=  os.Environ()
 for _,env := range envs{
   fmt.Println(env)
 }
}
image.png
image.png
39.查看指定值对应的环境变量

func LookupEnv(key string) (string, bool)

key值是区分大小写的

代码语言:txt
AI代码解释
复制
package main

import (
"os"
"fmt"
)

func main() {

 name,_ :=  os.LookupEnv("HOME")
 fmt.Println(name)
}
image.png
image.png

39.清除环境变量

func Environ() []string

请谨慎操作

40.获取当前程序可执行的文件地址

func Executable() (string, error)

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {

  name,_ := os.Executable()
  fmt.Println(name)
}
image.png
image.png

41.查找指定环境变量

func func Expand(s string, mapping func(string) string) string

func ExpandEnv(s string) string

方法 -

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  //HOME=/Users/xujie
  fmt.Println(os.Expand("${GOPATH}",os.Getenv))
}
image.png
image.png

方法 2

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {
  //HOME=/Users/xujie

  fmt.Println(os.ExpandEnv("${HOME}"))
  fmt.Println(os.ExpandEnv("$GOPATH"))
}
42.让程序已给定的状态码退出

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

func Exit(code int)

代码语言:txt
AI代码解释
复制
package main

import "os"

func main() {
   os.Exit(23)

}
image.png
image.png

43.设置环和取消环境变量

func Unsetenv(key string) error

func Setenv(key, value string) error

示例

代码语言:txt
AI代码解释
复制
package main

import (
	"os"
)

func main() {
	os.Setenv("TMPDIR", "/my/tmp")
	defer os.Unsetenv("TMPDIR")
}
44.创建软链接

软链接和硬链接的区别

func Symlink(oldname, newname string) error

示例

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {

  err := os.Symlink("/Users/xujie/Desktop/file.txt","/Users/xujie/Desktop/软链接.txt")
  fmt.Println(err)
}
image.png
image.png

45.获取软链接文件对应的实际文件路径地址

func Readlink(name string) (string, error)

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)
func main() {
  err := os.Symlink("/Users/xujie/Desktop/file.txt","/Users/xujie/Desktop/软链接.txt")
  path,_ := os.Readlink("/Users/xujie/Desktop/软链接.txt")
  fmt.Println(err)
  fmt.Println(path)
}
image.png
image.png

46.更改指定文件的访问和修改时间

func Chtimes(name string, atime time.Time, mtime time.Time) error

第二个参数访问时间 第三个参数修改时间

代码语言:txt
AI代码解释
复制
 os.Chtimes("/Users/xujie/Desktop/file.txt",time.Now(),time.Now().Add(time.Hour * 24))
image.png
image.png

我们把修改时间改成了明天

47.创建文件夹,并设置权限

func MkdirAll(path string, perm FileMode) error

规则

1.如果已经存在同名文件夹,则此方法不做任何事情

2.文件夹里面所有文件都是同样的权限

代码语言:txt
AI代码解释
复制
 os.MkdirAll("/Users/xujie/Desktop/未命名文件夹2",0200)
image.png
image.png

48.设置文章的读写位置

func (f *File) Seek(offset int64, whence int) (ret int64, err error)

Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误

我们写一个示例,以此读取10个自己,知道读取文件所有的内容

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
  "fmt"
)

func main() {

 file,error := os.Open("/Users/xujie/Desktop/file.txt")
 defer  file.Close()
 if error != nil {
   fmt.Println(error)
   return
 }

 offset := int64(0)
 data := make([]byte,10)
 totalData := make([]byte,0,100)

 for {
  // 设置偏移量 
  file.Seek(offset,0)
  offset += 10
  // 读取数据
  _,error = file.Read(data)
   if error != nil{
     fmt.Println(error)
     break
   }
  // 拼接数据
  totalData = append(totalData,data...)
   fmt.Println(string(data))
 }
  fmt.Println(string(totalData))
image.png
image.png
image.png
image.png

file.Seek(offset,0) offset = 0 从文件中读取10个数据,之后偏移量设置为offset = 10,则从文件内容第11个字节开始读取,当Read方法读取文件到结尾时,会返回EOF标识,这个时候程序退出for循环


49.修改文件权限

func Lchown(name string, uid, gid int) error

代码语言:txt
AI代码解释
复制
package main
import (
  "os"
  "fmt"
)
func main() {
 error := os.Lchown("/Users/xujie/Desktop/file.txt",os.Getuid(),-1)
  if error != nil {
    fmt.Println(error)
  }
}

修改权限前

image.png
image.png

修改权限后

image.png
image.png
50.管道的用法
代码语言:txt
AI代码解释
复制
func Pipe() (r *File, w *File, err error)

这个方法主要在协程之间进行数据传递,r.read 方法会等待接受w文件中写数据

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
    "time"
)

func main() {
  r,w,error := os.Pipe()
  go write(w)
  data := make([]byte,1000)
  // 如果数据没有写入w中,则此方法一直在等待
  n,_ := r.Read(data)
  if error != nil{
    println(error)
  }
  fmt.Println("读取数据:")
  fmt.Println(string(data[:n]))
}

func write(w *os.File){
  time.AfterFunc(time.Second* 2, func() {
     w.WriteString("ABCD")
     w.WriteString("EFGH")
     fmt.Println("数据已写入w")
  })
}

51.创建系统错误

func NewSyscallError(syscall string, err error) error


52.通过pid查找进行进程

func FindProcess(pid int) (*Process, error)

查找增加运行的进程,但是在 Unix 系统上,无论过程是否存在,FindProcess 都会成功并为给定的 PID 返回一个 Process

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
  )

func main() {
 pid := os.Getpid()
 process,error := os.FindProcess(pid)
 if error != nil{
   fmt.Println(error)
 }
 fmt.Println(pid)
 fmt.Println(process)
 
}
image.png
image.png
53.启动一个进行

func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)

54.杀死进程

func (p *Process) Kill() error

代码语言:txt
AI代码解释
复制
package main

import (
  "os"
    "fmt"
      )

func main() {

 pid := os.Getpid()
 process,error := os.FindProcess(pid)
 if error != nil{
   fmt.Println(error)
 }
 process.Kill()
 // 进行杀死 下面就不会执行了
 fmt.Println(pid)
 fmt.Println(process)

}
image.png
image.png

55.释放与进行p关联的任何资源

func (p *Process) Release() error

Release释放进程p绑定的所有资源, 使它们(资源)不能再被(进程p)使用。只有没有调用Wait方法时才需要调用本方法

func (p *Process) Signal(sig Signal) error

func (p Process) Wait() (ProcessState, error)

func (p *ProcessState) Exited() bool

func (p *ProcessState) Pid() int

func (p *ProcessState) String() string

func (p *ProcessState) Success() bool

func (p *ProcessState) Sys() interface{}

func (p *ProcessState) SysUsage() interface{}

func (p *ProcessState) SystemTime() time.Duration

func (p *ProcessState) UserTime() time.Duration

func (e *SyscallError) Error() string

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
如何解决错误:“ERROR: You have requested merging of multiple formats but ffmpeg is not installed. Aborting
在处理视频或音频格式转换时,使用工具如youtube-dl、yt-dlp等,遇到类似“ERROR: You have requested merging of multiple formats but ffmpeg is not installed. Aborting due to --abort-on-error”这样的错误提示是非常常见的。这个错误通常发生在尝试下载或合并不同格式的视频和音频时,且系统中缺少ffmpeg工具,导致下载过程无法继续。
猫头虎
2025/04/20
920
史上最强音视频下载神器youtube-dl回归,GitHub75k星
一个「身价」7.5万颗星的GitHub项目,从受热捧,到被起诉下架,再到引发社区热议。
量子位
2020/12/03
8210
史上最强音视频下载神器youtube-dl回归,GitHub75k星
不习惯在终端使用 youtube-dl?可以使用这些 GUI 应用
如果你一直在关注我们,可能已经知道 youtube-dl 项目曾被 GitHub 暂时下架 以合规。但它现在已经恢复并完全可以访问,可以说它并不是一个非法的工具。
用户1880875
2021/09/09
1.8K0
使用命令行下载youtube的视频和字幕
老高买使用搬瓦工有好久了,但是直到今天才想起来用命令行下载youtube的视频,实在是惭愧。赶紧加班写篇文章赎罪!
老高的技术博客
2022/12/28
1.9K0
使用命令行下载youtube的视频和字幕
使用 youtube-dl 下载网络视频
youtube-dl 是一个命令行程序,用于从 YouTube.com 和其他几个网站下载视频。它需要 Python 解释器,版本2.6,2.7或3.2+,它是跨平台程序。它可以运行在 Unix 、Windows 或 macOS 上。它是开源的,这意味着你可以修改它,重新分配或使用它。本文介绍如何使用它从视频网站如 YouTube、Youku、Bilibili 等视频站点下载并处理视频
SkyRiN
2018/11/20
8.3K2
用 yt-dlp 下载整个 YouTube 频道的视频
yt-dlp 是 youtube-dl 的一个分支,主要基于现在维护不太活跃的 youtube-dlc。该项目的主要重点是添加新功能和补丁,同时与原始项目保持同步。
生信菜鸟团
2022/02/17
7.4K0
用 yt-dlp 下载整个 YouTube 频道的视频
视频采集工具 youtube-dl 接口介绍
youtube-dl 是一个通过命令行下载视频的工具,其不仅支持 youtube 网站的视频下载,还支持上百个不同的视频网站。用户可以在官方网站上下载 Windows(exe) 和 Linux(tar.gz) 的版本,之后解压并使用对应的命令即可。 对于部分需要使用 youtube-dl 进行开发并且调用其接口为其他功能服务的用户而言,可以在 Github 上找到源码并且进行二次开发,也可以直接调用其 python 接口。关于如何在命令行直接使用打包好的 youtube-dl 工具有许多的文档进行介绍,这篇文章主要是对 youtube-dl 提供的一些接口参数及其功能进行说明,如有错误或不严谨的地方欢迎批评指正。
siri
2022/11/18
2.3K0
GitHub 标星 119K+!这些神器仅需一行代码即可下载全网视频!
来源 | 杰哥的IT之旅(ID:Jake_Internet) 转载请联系授权(微信ID:Hc220066)
杰哥的IT之旅
2020/10/23
2.1K0
GitHub 标星 119K+!这些神器仅需一行代码即可下载全网视频!
正确下载youtube视频的方式
youtube这个不存在的网站上有很多有用的资料,一般来说我们是可以下载所有视频到本地以供离线的情况下的研究学习,网上有很多工具提供了下载功能,但是在试用了很多标称很好用的软件后,老高发现,真的没有一个能和youtube-dl相提并论,所以老高还是记录一下如何使用正确使用youtube-dl!
老高的技术博客
2022/12/28
1.4K0
标星7.2万热门开源项目youtube-dl遭下架,开发者的权益谁来保护?
开源项目 youtube-dl 是一个使用 Python 编写的脚本,可以下载热门视频网站的音视频,并转换视频格式和清晰度。它是 GitHub 上的热门项目,获得 7.2 万多星。
AI算法与图像处理
2020/11/06
1.4K1
FFmpeg最全教程
​ FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分:
AI拉呱
2021/01/14
31.5K0
介绍一个能从YouTube和其他视频网站下载视频的强大工具——yt-dlp
今天我想和大家分享一个非常实用的命令行程序——yt-dlp。这个小工具可以帮助我们从 YouTube.com 和其他视频网站下载视频。它其实是 youtube-dl 项目的一个分支,由于原项目在 2020 年因版权问题而暂停更新,一些开发者和用户决定创建 yt-dlp 来继续提供类似的功能。
TechHarmony
2024/04/19
2.9K0
GitHub 标星 119K+!这些神器仅需一行代码即可下载全网视频!
今天这篇文章的内容对于经常浏览各大视频网站的同学来说,是一大神器工具。当你看到自己目前所需的视频时想尽各种办法保存至本地,方便后期再次回看。恰巧有些视频可能需要会员才能够下载,有些第三方的视频下载器可能在下载过程中比较缓慢。
崔庆才
2020/10/30
6.6K0
GitHub 标星 119K+!这些神器仅需一行代码即可下载全网视频!
网易云音乐歌单下载器
本项目不支持越权使用, VIP 歌曲请开通 VIP 后结合 --cookie 使用。详见 #54
井九
2024/10/12
2830
网易云音乐歌单下载器
ChatGPT批量下载YouTube视频为mp3音频
获取用户输入的YouTube视频地址(用户一次可能输入一个URL,也可能一次输入多个,确保能自动识别出多个不同的http地址);
AIGC部落
2024/10/21
2620
ChatGPT批量下载YouTube视频为mp3音频
轻松获取在线媒体:视频下载工具推荐
这些开源项目为用户提供了便捷的方式来下载在线媒体内容。无论是从流行视频网站如YouTube、优酷、BiliBili 等下载视频和音频,还是从网页中获取感兴趣的图片,这些项目都能满足你的需求。
小柒
2023/08/10
6590
轻松获取在线媒体:视频下载工具推荐
使用FFmpeg进行HLS打包——FFmpeg简单学
 点击上方“LiveVideoStack”关注我们 翻译、编辑:Alex 技术审校:赵军 本文来自OTTVerse,作者为Krishna Rao Vijayanagar。 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 FFmpeg Easy-Tech #023# 在本文中,我们将学习使用FFmpeg进行HLS打包。使用FFmpeg的好处在于:你可以在不离开命令行的情况下,执行提取视频、调整视频尺寸、转码、打包以及传输视频的所有操作。 我们首先看一下为VOD(点播)创建HLS打包的所
LiveVideoStack
2022/05/09
2.5K0
使用FFmpeg进行HLS打包——FFmpeg简单学
“治不了GitHub,还治不了你?”唱片行业追杀youtube-dl
晓查 发自 凹非寺 量子位 | 公众号 QbitAI YouTube视频下载神器youtube-dl还在被追杀。 这款在GitHub上累计收获100k+ Star的开源工具,2020年末遭到了美国唱片协会(RIAA)的投诉而一度下架。 最近,索尼、华纳、环球三大唱片巨头,又在德国起诉一家名为Uberspace的小型网页托管服务商。 Uberspace不提供任何youtube-dl源代码,只是托管其官方网站,并提供链接到GitHub。 当初GitHub顶住压力让youtube-dl重新上架,既然动不了Git
量子位
2022/03/08
4590
一款跨平台的快速,简单,干净的视频下载器:Annie,支持Bilibili/Youtube等多个网站
说明:最近发现了个很强的下载神器Annie,一款用Go构建的快速,简单,干净的视频下载器,支持的平台很多,包括MacOS、Windows、Linux等,安装和使用是非常简单的,很适合新手,支持的网站也多,目前支持以下网站:
子润先生
2021/05/29
4.3K0
「简单实战」YouTube Iframe API 的使用
业务需求需要在自己的网页上嵌入油管( youtube )上的视频,所以去踩了油管 IFrame Player API 的坑。其实和大多数国内视频网站的 ifram Embed 方式是相似,比如说爱奇艺、腾讯视频、优酷等。在这些视频网站上你会发现都有分享功能,其中有一项就是通用代码。油管提供的 IFrame Player API 也是类似的方案。
拾贰
2019/08/28
4.6K0
「简单实战」YouTube Iframe API 的使用
推荐阅读
相关推荐
如何解决错误:“ERROR: You have requested merging of multiple formats but ffmpeg is not installed. Aborting
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.获取当前目录
  • 2.修改当前目录
  • 3.修改文件权限
  • 4.获取用户识别码uid 和 群组识别码gid
  • 5.查看用户所属组的列表
  • 6. 获取调用者有效的用户标识
  • 7.返回底层系统的内存页面大小
  • 8.获取主机名称
  • 9.获取当前进程id 和其父进程id
  • 10.获取文件的状态
  • 11.错误检测
  • 12.创建文件夹
  • 13.删除文件夹或者文件
  • 14.修改文件夹或者文件的名称
  • 15.移动文件夹或者文件
  • 16.新建文件
  • 17.打开文件
  • 18.写入文件
  • 19.读取文件
  • 20.删除文件
  • 21.关闭文件
  • 22.检测文件是否是同一个
  • 23.获取文件模式相关信息
  • 24.把文件所在的目录切换为当前目录
  • 25.查看文件名称
  • 26.如何查看所有文件夹下的所有文件和文件数量
  • 27.读取文件夹的下面文件的名称
  • 28.获取临时目录的文件夹路径
  • 29.判断字符是否是支持的路径分割符
  • 30.查看环境变量
  • 31.获取文件对应的unix文件描述符
  • 32.Chown修改文件的用户ID和组ID
  • 32.修改文件权限
  • 33.强制改变文件大小
  • 34.链接 硬链接
  • 35.同步保存当前文件的内容
  • 36.NewFile使用给出的Unix文件描述符和名称创建一个文件
  • 37.Lstat返回一个描述name指定的文件对象的FileInfo
  • 38.查看所有环境变量
  • 39.查看指定值对应的环境变量
  • 39.清除环境变量
  • 40.获取当前程序可执行的文件地址
  • 41.查找指定环境变量
  • 42.让程序已给定的状态码退出
  • 43.设置环和取消环境变量
  • 44.创建软链接
  • 45.获取软链接文件对应的实际文件路径地址
  • 46.更改指定文件的访问和修改时间
  • 47.创建文件夹,并设置权限
  • 48.设置文章的读写位置
  • 49.修改文件权限
  • 50.管道的用法
  • 51.创建系统错误
  • 52.通过pid查找进行进程
  • 53.启动一个进行
  • 54.杀死进程
  • 55.释放与进行p关联的任何资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档