Go红队开发—文件操作

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

目录

文件操作

由于在上一期编解码中对文件有操作需求,以是这一期补上文件操作功能.
依旧是直接放代码,加快学习进度,代码拿着就用即可,都是内置的功能函数。
PS:一些函数参数或者功能解释都放在代码注释里面了
创建目录
  1. // 创建目录
  2. func createDir() {
  3.     err := os.Mkdir("test_dir", os.ModePerm)
  4.     if err != nil {
  5.         fmt.Println("创建目录失败")
  6.         return
  7.     }
  8.     fmt.Println("创建目录成功")
  9. }
复制代码
创建文件
  1. // 创建文件
  2. func createFile(filename string) {
  3.     newfile, err := os.Create(filename)
  4.     defer newfile.Close()
  5.     if err != nil {
  6.         fmt.Println("创建文件失败:", err)
  7.         return
  8.     }
  9.     fmt.Println("创建文件成功:", newfile.Name())
  10. }
复制代码
获取File信息

文件与目录都能判断
  1. func getFileInfo() {
  2.     //path := "test_dir"
  3.     path := "test.txt"
  4.     fileInfo, err := os.Stat(path)
  5.     if err != nil {
  6.         fmt.Println(err)
  7.         return
  8.     }
  9.     fmt.Println("文件名:", fileInfo.Name())
  10.     fmt.Println("文件大小:", fileInfo.Size())
  11.     fmt.Println("文件权限:", fileInfo.Mode())
  12.     fmt.Println("最后一次修改时间:", fileInfo.ModTime())
  13.     fmt.Println("是否为目录: ", fileInfo.IsDir())
  14.     //fmt.Println("系统接口类型: %T", fileInfo.Sys())
  15.     //fmt.Println("系统信息: %+v", fileInfo.Sys())
  16. }
复制代码
文件重命名
  1. // 文件重命名
  2. func renameFile() {
  3.     oldFileName := "text.txt"
  4.     newFileName := "newtest.txt"
  5.     err := os.Rename(oldFileName, newFileName)
  6.     if err != nil {
  7.         fmt.Println("重命名出错:", err)
  8.         return
  9.     }
  10. }
复制代码
删除文件
  1. // 删除文件
  2. func removeFile(fileaName string) {
  3.     err := os.Remove(fileaName)
  4.     if err != nil {
  5.         fmt.Println("删除失败:", err)
  6.         return
  7.     }
  8.     fmt.Println(fileaName, "删除成功")
  9. }
复制代码
打开关闭文件
  1. // 打开关闭文件
  2. // 介绍原始open打开文件与OpenFile可以提供更多的选项打开文件
  3. func open_close_file() {
  4.   
  5.     fmt.Println("os.Open打开文件")
  6.     file, err := os.Open("test.txt")
  7.     defer file.Close() //延迟关闭文件,建议打开文件后都习惯性写一个
  8.     if err != nil {
  9.         fmt.Println("os.Open打开文件失败:", err)
  10.         return
  11.     }
  12.     fmt.Println("os.Open文件打开成功")
  13.     //---------------------------------------------
  14.     fmt.Println("os.OpenFile打开文件")
  15.     file, err = os.OpenFile("test.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
  16.     defer file.Close()
  17.     if err != nil {
  18.         fmt.Println("os.OpenFile打开文件失败:", err)
  19.         return
  20.     }
  21.     fmt.Println("os.OpenFile打开文件成功")
  22. }
复制代码
判断文件是否存在
  1. // 判断文件是否存在
  2. func isExistFile(fileName string) {
  3.     _, err := os.Stat(fileName)
  4.     if err != nil {
  5.         //因为报出错误可能有很多种原因,想要知道是不是文件不存在导致的err还需要验证
  6.         if os.IsNotExist(err) {
  7.             fmt.Println("确认这个错误是文件不存在导致的:", err)
  8.         }
  9.   
  10.     }
  11. }
复制代码
判断文件是否有读取权限
  1. // 判断文件是否有读写权限
  2. func isPermission() {
  3.   
  4.     file, err := os.OpenFile("test.txt", os.O_RDONLY, 0666) //直接给O_WRONLY标志,可以判断是否有写权限
  5.     defer file.Close()
  6.     if err != nil {
  7.         if os.IsPermission(err) {
  8.             fmt.Println("没有读取权限:", err)
  9.         }
  10.     }
  11.     fmt.Println("可读")
  12.   
  13.     file, err = os.OpenFile("test.txt", os.O_WRONLY, 0666) //直接给O_WRONLY标志,可以判断是否有写权限
  14.     defer file.Close()
  15.     if err != nil {
  16.         if os.IsPermission(err) {
  17.             fmt.Println("没有写权限", err)
  18.         }
  19.     }
  20.     fmt.Println("可写")
  21.   
  22. }
复制代码
复制文件
  1. // 文件复制
  2. func copyFile() {
  3.   
  4.     //打开一个你要复制的文件
  5.     src_file, src_err := os.Open("test.txt")
  6.     defer src_file.Close()
  7.     if src_err != nil {
  8.         fmt.Println("文件打开失败:", src_err)
  9.     }
  10.   
  11.     //创建一个新文件用来复制内容到这里(其实可以用存在的文件继续打开也行,主要是用file句柄而已)
  12.     des_file, des_err := os.Create("newtest.txt")
  13.     defer des_file.Close()
  14.     if des_err != nil {
  15.         fmt.Println("文件创建失败", des_err)
  16.     }
  17.   
  18.     //复制内容到新文件中
  19.     bytesWritten, err := io.Copy(des_file, src_file) //bytesWritten是计算复制的长度
  20.     if err != nil {
  21.         fmt.Println("复制失败:", err)
  22.     }
  23.     fmt.Println("写入了:", bytesWritten)
  24.   
  25.     // 将文件内容flush到硬盘中,这操作对于我们现在来说是不必要的,
  26.     // 因为在大多数情况下,程序正常退出时,数据会被操作系统自动刷新到磁盘。
  27.     // 当我们在不断地写入内容的时候可能就需要不定期的进行flush
  28.     err = des_file.Sync()
  29. }
复制代码
Read读取
  1. // ---------------------------------------------------
  2. // 读取文件内容
  3. // ---------------------------------------------------
  4. // Read读取文件内容,返回读取的长度和内容,如果读取的长度小于切片的长度,说明文件读取完了
  5. func readFile() {
  6.     //打开文件
  7.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  8.     defer file.Close()
  9.     if err != nil {
  10.         fmt.Println("打开文件失败:", err)
  11.         return
  12.     }
  13.     bytes_content := make([]byte, 10)           //Read就是传进内容到这个切片空间中
  14.     contentlen, err := file.Read(bytes_content) //返回的是读取的长度
  15.     if err != nil {
  16.         fmt.Println("读取文件失败:", err)
  17.         return
  18.     }
  19.     fmt.Printf("读取长度:%d\n", contentlen)
  20.     fmt.Println("读取内容:", string(bytes_content))
  21. }
复制代码
ReadFull读取
  1. // ReadFull读取文件内容,返回读取的长度和内容,如果读取的长度小于切片的长度会返回错误
  2. func readFullFile() {
  3.     //打开文件
  4.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  5.     defer file.Close()
  6.     if err != nil {
  7.         fmt.Println("打开文件失败:", err)
  8.         return
  9.     }
  10.   
  11.     //ReadFull就是传进内容到这个bytes_content切片空间中,如果给的空间大于读取的内容就会报错,小于的的话给多少读多少
  12.     bytes_content := make([]byte, 2)
  13.     contentlen, err := io.ReadFull(file, bytes_content) //返回的是读取的长度
  14.     if err != nil {
  15.         fmt.Println("读取文件失败:", err)
  16.         return
  17.     }
  18.     fmt.Printf("读取长度:%d\n", contentlen)
  19.     fmt.Println("读取内容:", string(bytes_content))
  20. }
复制代码
ReadAtLeast读取
  1. // ReadAtLeast至少读取xx bytes文件内容
  2. func readAtLeastFile() {
  3.     //打开文件
  4.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  5.     defer file.Close()
  6.     if err != nil {
  7.         fmt.Println("打开文件失败:", err)
  8.         return
  9.     }
  10.     bytes_content := make([]byte, 512) //Read就是传进内容到这个切片空间中
  11.   
  12.     // io.ReadAtLeast()在拿不到最小的字节内容的时候会返回错误,
  13.     // 如果你不return回去,
  14.     // 他会把已读的文件保留。你依旧能够打印读取到的内容
  15.     //相比ReadFull,ReadAtLeast不会报错,
  16.     // 只是说最小字节数是至少读取这么多,
  17.     // 但是依旧会往后读取,报错会留下已读取的内容
  18.     minBytes := 10
  19.     contentlen, err := io.ReadAtLeast(file, bytes_content, minBytes) //返回的是读取的长度
  20.     if err != nil {
  21.         fmt.Println("读取文件失败:", err)
  22.         //return   //取消return,依旧能打印读取到的内容
  23.     }
  24.     fmt.Printf("读取长度:%d\n", contentlen)
  25.     fmt.Println("读取内容:", string(bytes_content))
  26. }
复制代码
ReadAll读取
  1. // ReadAll读取文件所有内容
  2. func readAllFile() {
  3.     //打开文件
  4.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  5.     defer file.Close()
  6.     if err != nil {
  7.         fmt.Println("打开文件失败:", err)
  8.         return
  9.     }
  10.     // io.ReadAll()会读取所有的文件内容,返回的是读取的长度
  11.     content, err := io.ReadAll(file) //返回的是读取的长度
  12.     if err != nil {
  13.         fmt.Println("读取文件失败:", err)
  14.         return
  15.     }
  16.     fmt.Println("读取内容:", string(content))
  17. }
复制代码
bufio读取

以下是 bufio.Scanner 中几种常用分割符的具体阐明和示例:
bufio.ScanWords

  • 分割符: 空格( )或连续的空缺字符(包括空格、制表符 \t、换行符 \n 等)。
  • 行为: 每次扫描一个单词(以空缺字符分隔的字符串)。
  • 示例:
    1. scanner.Split(bufio.ScanWords)
    复制代码
    输入:
    1. "Hello   World\nGo Programming"
    复制代码
    输出:
    1. "Hello"
    2. "World"
    3. "Go"
    4. "Programming"
    复制代码
bufio.ScanLines

  • 分割符: 换行符(\n)。
  • 行为: 每次扫描一行(以换行符分隔的字符串)。
  • 示例:
    1. scanner.Split(bufio.ScanLines)
    复制代码
    输入:
    1. "Hello\nWorld\nGo Programming"
    复制代码
    输出:
    1. "Hello"
    2. "World"
    3. "Go Programming"
    复制代码
bufio.ScanBytes

  • 分割符: 无(按字节分割)。
  • 行为: 每次扫描一个字节。
  • 示例:
    1. scanner.Split(bufio.ScanBytes)
    复制代码
    输入:
    1. "Hello"
    复制代码
    输出:
    1. 'H'
    2. 'e'
    3. 'l'
    4. 'l'
    5. 'o'
    复制代码
bufio.ScanRunes

  • 分割符: 无(按字符分割)。
  • 行为: 每次扫描一个字符(支持多字节字符,如中文)。
  • 示例:
    1. scanner.Split(bufio.ScanRunes)
    复制代码
    输入:
    1. "你好,世界!"
    复制代码
    输出:
    1. '你'
    2. '好'
    3. ','
    4. '世'
    5. '界'
    6. '!'
    复制代码
总结
分割函数分割符行为示例输入示例输出bufio.ScanWords空格( )或连续空缺字符每次扫描一个单词"Hello   World\nGo""Hello", "World", "Go"bufio.ScanLines换行符(\n)每次扫描一行"Hello\nWorld\nGo""Hello", "World", "Go"bufio.ScanBytes无每次扫描一个字节"Hello"'H', 'e', 'l', 'l', 'o'bufio.ScanRunes无每次扫描一个字符(支持多字节字符)"你好,世界!"'你', '好', ',', '世', '界', '!'注意事项

  • bufio.ScanWords:

    • 会忽略连续的空缺字符(如多个空格或制表符)。
    • 适合处理以空格分隔的文本。

  • bufio.ScanLines:

    • 会保存每行的内容(包括行尾的空缺字符)。
    • 适合处理逐行文本。

  • bufio.ScanBytes:

    • 按字节分割,适合处理二进制数据或需要逐字节分析的场景。

  • bufio.ScanRunes:

    • 按字符分割,支持多字节字符(如中文、日文、韩文等)。
    • 适合处理 Unicode 文本。

示例代码:
  1. // bufio读取文件能够配合scanner一行一行读取,安全开发过程中可能用的最多,因为爆破的需求一般都是一行一行读取
  2. func bufioReadFile() {
  3.     //打开文件
  4.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  5.     defer file.Close()
  6.     if err != nil {
  7.         fmt.Println("打开文件失败:", err)
  8.         return
  9.     }
  10.     //bufio.NewReader()返回一个io.Reader对象,可以用来读取文件内容
  11.     reader := io.Reader(file)
  12.     //bufio.NewScanner()返回一个io.Scanner对象,可以用来读取文件内容
  13.     scanner := bufio.NewScanner(reader)
  14.     //scanner.Split(bufio.ScanWords) //按照空格分割
  15.     //scanner.Split(bufio.ScanLines) //按照换行符分割 默认不写就是按照换行符分割
  16.     //scanner.Split(bufio.ScanBytes) //按照字节分割
  17.     //scanner.Split(bufio.ScanRunes) //按照字符分割
  18.     for scanner.Scan() {
  19.         fmt.Println(scanner.Text())
  20.     }
  21. }
复制代码
Write写入
  1. // ---------------------------------------------------
  2. // 写入文件内容
  3. // ---------------------------------------------------
  4. func write() {
  5.     file, err := os.OpenFile(
  6.         "test.txt",
  7.         os.O_CREATE|os.O_APPEND|os.O_RDWR|os.O_APPEND,
  8.         0666,
  9.     )
  10.     defer file.Close()
  11.     if err != nil {
  12.         fmt.Println("文件打开失败:", err)
  13.         return
  14.     }
  15.     bytesWrittenLen, err := file.Write([]byte("hello hack\n"))
  16.     if err != nil {
  17.         fmt.Println("内容写入失败:", err)
  18.         return
  19.     }
  20.     fmt.Printf("写入成功:%d字节长度\n", bytesWrittenLen)
  21. }
复制代码
WriteFile快速写入
  1. // 快速写内容
  2. // 用在需要快速简洁写入内容的时候
  3. func ioutil_WriteFile() {
  4.     err := ioutil.WriteFile("test.txt", []byte("hello hack2\n"), 0666)
  5.     if err != nil {
  6.         fmt.Println("内容写入失败:", err)
  7.         return
  8.     }
  9.   
  10. }
复制代码
暂时文件目录
  1.   
  2. // 临时文件和目录,在开发工具的时候可能会用的上
  3. func tmpDir_File() {
  4.     // 第一个参数是空字符串表示TempDir 会使用系统的默认临时目录。
  5.     // 在 Linux/macOS 上,通常是 /tmp。
  6.     // 在 Windows 上,通常是 C:\Users\<User>\AppData\Local\Temp。
  7.     tempDir, err := ioutil.TempDir("", "tmpDirName")
  8.     if err != nil {
  9.         fmt.Println("创建失败:", err)
  10.         return
  11.     }
  12.     fmt.Println("目录创建成功:", tempDir)
  13.   
  14.     tempFile, err := ioutil.TempFile(tempDir, "temp.txt") //创建文件要给参数:tempDir目录和temp文件名字
  15.     if err != nil {
  16.         fmt.Println("文件创建失败:", err)
  17.         return
  18.     }
  19.     fmt.Println("文件创建成功:", tempFile.Name())
  20.   
  21.     //虽然说是临时文件也耀手动关闭文件
  22.     defer tempFile.Close()
  23.   
  24.     err = os.Remove(tempFile.Name())
  25.     if err != nil {
  26.         fmt.Println("文件删除失败")
  27.         return
  28.     }
  29.   
  30.     err = os.Remove(tempDir)
  31.     if err != nil {
  32.         fmt.Println("目录删除失败")
  33.         return
  34.     }
  35.   
  36. }
复制代码
下载文件
  1. // http get downLoad文件到本地
  2. func downLoadFile() {
  3.     httpFile, err := os.OpenFile(
  4.         "baidu.html",
  5.         os.O_CREATE|os.O_RDWR,
  6.         0666,
  7.     )
  8.     if err != nil {
  9.         fmt.Println("文件打开失败")
  10.     }
  11.     defer httpFile.Close()
  12.     url := "http://www.baidu.com"
  13.     rep, err := http.Get(url)
  14.     defer rep.Body.Close()
  15.   
  16.     written, err := io.Copy(httpFile, rep.Body)
  17.     if err != nil {
  18.         fmt.Println("文件复制失败:", err)
  19.     }
  20.     fmt.Println("下载成功,文件大小(byte):\n", written)
  21. }
复制代码
文件指针操作
  1. func offsetFile() {
  2.     //打开文件
  3.     file, err := os.OpenFile("test.txt", os.O_RDWR, 0666)
  4.     defer file.Close()
  5.     if err != nil {
  6.         fmt.Println("打开文件失败:", err)
  7.         return
  8.     }
  9.     //获取文件的偏移量
  10.     var (
  11.         offset int64 = 1
  12.         whence int   = 1
  13.   
  14.         //whence用来计算offset的位置
  15.         // 0 = 文件开始位置
  16.         // 1 = 当前位置
  17.         // 2 = 文件结尾处
  18.     )
  19.     newP, err := file.Seek(offset, whence)
  20.     if err != nil {
  21.         fmt.Println("获取文件偏移量失败:", err)
  22.         return
  23.     }
  24.     fmt.Println("文件偏移量:", newP)
  25.     //直接当前位置读取文件内容
  26.     bytes_content := make([]byte, 10)           //Read就是传进内容到这个切片空间中
  27.     contentlen, err := file.Read(bytes_content) //返回的是读取的长度
  28.     if err != nil {
  29.         fmt.Println("读取文件失败:", err)
  30.         return
  31.     }
  32.     fmt.Printf("读取长度:%d\n", contentlen)
  33.     fmt.Println("读取内容:", string(bytes_content))
  34.   
  35. }
复制代码
修改文件权限/拥有者/时间戳

参考文章:https://colobu.com/2016/10/12/go-file-operations/
这篇文章作者写的这真的很好,全是干货。
  1. package main
  2. import (
  3.     "log"
  4.     "os"
  5.     "time"
  6. )
  7. func main() {
  8.     // 使用Linux风格改变文件权限
  9.     err := os.Chmod("test.txt", 0777)
  10.     if err != nil {
  11.         log.Println(err)
  12.     }
  13.     // 改变文件所有者
  14.     err = os.Chown("test.txt", os.Getuid(), os.Getgid())
  15.     if err != nil {
  16.         log.Println(err)
  17.     }
  18.     // 改变时间戳
  19.     twoDaysFromNow := time.Now().Add(48 * time.Hour)
  20.     lastAccessTime := twoDaysFromNow
  21.     lastModifyTime := twoDaysFromNow
  22.     err = os.Chtimes("test.txt", lastAccessTime, lastModifyTime)
  23.     if err != nil {
  24.         log.Println(err)
  25.     }
  26. }
复制代码
知识细节补充

OS.OpenFile

先介绍一下这个openfile功能,之前我是使用os.open来打开文件, 但是只能以只读的方式打开文件,而openfile更通用的文件打开函数,可以指定打开模式(只读、只写、读写等)和文件权限。接下来我都会使用openfile来操作文件,更精细化控制文件。
⽂件打开模式标志,在使用openfile的时候需要以一个怎样的模式打开文件
比如:os.OpenFile("example.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
多个形式可以用|管道符分开,表现可读可写,同时CREATE表现当文件不存在的时候创建,同时APPEND表现追加模式。
更多模式可以看下面介绍
  1. os.O_RDONLY:只读模式打开⽂件。
  2. os.O_WRONLY:只写模式打开⽂件。
  3. os.O_RDWR:读写模式打开⽂件。
  4. os.O_APPEND:追加模式。如果⽂件已存在,数据将写⼊⽂件末尾。
  5. os.O_CREATE:如果⽂件不存在,则创建⽂件。
  6. os.O_EXCL:与 os.O_CREATE ⼀起使⽤,⽂件必须不存在。
  7. os.O_SYNC:同步 I/O,保证写⼊数据和元数据同步到存储设备。
  8. os.O_TRUNC:如果⽂件已存在,打开时将其⻓度截断为零。
复制代码
细节写在前头:我们读取完或者写入完后,文件指针是不在开头的,如果你读取完就直接写入就是在你读取到的当前位置写入,或者你写入完成后继续读取就是在当前位置读取,可能读取不到你想要的内容,以是file.Seek就很有须要了,或者你重新打开该文件也可以自动将指针指向开头。
演示代码:
打开一个文件写入hello hack,然后读取这个文件内容

  • O_RDWR:可读可写
  • O_CREATE:文件不存在就创建
  • O_APPEND:追加模式
  • 末了的0666是文件操作权限,这里就涉及到linux的文件权限问题了(忽略,后面讲)
  1. func write_readTest() {
  2.     file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  3.     defer file.Close()
  4.     if err != nil {
  5.         fmt.Println(err)
  6.         return
  7.     }
  8.     file.WriteString("hello hack") // 写入文件
  9.     // 读取文件
  10.     scanner := bufio.NewScanner(file)
  11.   
  12.     //读取完文件后,文件指针已经到了文件末尾,需要重新定位到文件开头
  13.     // 将文件指针重新定位到文件开头
  14.     file.Seek(0, 0)
  15.     for scanner.Scan() {
  16.         fmt.Println(scanner.Text()) //一行一行读取
  17.     }
  18.     if err := scanner.Err(); err != nil {
  19.         fmt.Println("读取文件失败:", err)
  20.     }
  21.   
  22. }
复制代码
bufio

我们在编解码的时候就用了这个bufio,我们可以new一个scanner来一行一行读取文件内容,如果你需要更细粒度的控制(如按字节读取),可以使用 bufio.Reader。
  1. //常用方法
  2. file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  3.         // 读取文件
  4.     scanner := bufio.NewScanner(file)
  5.     for scanner.Scan() {
  6.         fmt.Println(scanner.Text()) //一行一行读取
  7.     }
  8.     if err := scanner.Err(); err != nil {
  9.         fmt.Println("读取文件失败:", err)
  10.     }
复制代码
os.Stat

os.Stat 是 Go 语言中用于获取文件或目录信息的函数。它的作用是返回一个形貌文件或目录状态的对象(os.FileInfo)

  • 参数 name:

    • 继承一个字符串参数,表现文件或目录的路径。
    • 可以是相对路径(如 "../example.txt 或者目录 ../dirname")或绝对路径(如 "/home/user/example.txt")。
    • 也可以是文件名(如果文件在当前工作目录下)。

  • 返回值:

    • FileInfo: 一个接口类型,包含文件或目录的具体信息。
    • error: 如果操作失败(如文件不存在),返回错误信息。

os.fileInfo

os.FileInfo 是一个接口,包含以下方法:
方法名返回值类型阐明Name() stringstring返回文件或目录的名称(不包括路径)。Size() int64int64返回文件的字节大小(目录通常返回 0)。Mode() FileModeFileMode返回文件的权限和模式。ModTime() time.Timetime.Time返回文件的末了修改时间。IsDir() boolbool判断是否是目录。Sys() interface{}interface{}返回底层数据源(通常为 nil)。文件权限

使用⼋进制数表现⽂件的权限,这里是linux文件权限管理的知识,不懂自查。
os.ModePerm:⽂件的默认权限(0777)
  1. os.ModeDir:表示⼀个⽬录。
  2. os.ModeAppend:表示⽂件只能追加写⼊。
  3. os.ModeExclusive:表示⽂件是独占的。
  4. os.ModeTemporary:表示⽂件是临时⽂件。
  5. os.ModeSymlink:表示⽂件是⼀个符号链接。
  6. os.ModeDevice:表示⽂件是⼀个设备⽂件。
  7. os.ModeNamedPipe:表示⽂件是⼀个命名管道。
  8. os.ModeSocket:表示⽂件是⼀个 Unix 域套接字。
  9. os.ModeSetuid:表示⽂件具有 setuid 位。
  10. os.ModeSetgid:表示⽂件具有 setgid 位。
  11. os.ModeCharDevice:表示⽂件是⼀个字符设备。
  12. os.ModeSticky:表示⽂件具有粘滞位。
  13. os.ModeIrregular:表示⽂件是⼀个不规则⽂件。
复制代码
参考文章:https://colobu.com/2016/10/12/go-file-operations

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表