golang 文件
概念
文件是计算机系统中用于存储和管理的 数据集合,具有唯一的名称,存在于存储介质上,包含创建、修改等属性,通过文件系统进行组织,用户可进行读取、写入等操作
文件流
文件输入流(InputStream)
- 定义:文件输入流是从文件到程序的 数据传输路径。
- 用途:用于从文件中读取数据
- 操作:包括打开文件、读取数据、关闭文件等
- 类型:可以是字节流(读取字节)或字符流(读取字符)
文件输出流(OutputStream)
- 定义:文件输出流是从程序到文件的数据传输路径
- 用途:用于将数据写入到文件
- 操作:包括打开文件、写入数据、关闭文件等
- 类型:同样可以是字节流(写入字节)或字符流(写入字符)
文件流的特性
顺序性:文件流中的数据是按顺序读取或写入的,通常从文件的开始到结束
缓冲区:文件流通常会使用缓冲区来提高数据传输的效率
状态管理:文件流需要管理其状态,如当前位置、是否已到达文件末尾等
异常处理:文件流操作可能会抛出异常,如文件不存在、权限不足、磁盘空间不足等
type File
type File struct { // 内含隐藏或非导出字段 }
File代表一个打开的文件对象
os.File
类型实现了多个接口,使得 os.File
对象可以用于文件的读取和写入操作。os.File
类型提供了一组用于操作文件的方法。这些方法可以分为几个主要类别:文件属性查询、文件操作(如读写)、文件位置调整、文件系统操作等
文件创建与打开
func Create(name string) (file *File, err error)
作用:创建一个新文件。如果文件已存在,它会将文件截断到0长度
参数:
name
: 要创建的文件的名称
返回值:
file
: 指向新创建的文件的指针err
: 可能发生的错误
示例:
file, err := os.Create("example.txt") if err != nil { fmt.Println("Error creating file:", err) return } defer file.Close() // 确保在函数结束时关闭文件
func Open(name string) (file *File, err error)
作用:打开一个已存在的文件用于读取
参数:
name
: 要打开的文件的名称
返回值:
file
: 指向打开的文件的指针err
: 可能发生的错误
示例:
file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
作用:根据指定的标志和权限打开或创建一个文件
参数:
name
: 要打开或创建的文件的名称flag
: 文件打开的模式,如os.O_RDONLY
、os.O_WRONLY
、os.O_CREATE
等
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 // 如果可能,打开时清空文件 )
perm
: 文件的模式和权限位
type FileMode
type FileMode uint32
FileMode代表文件的模式和权限位。这些字位在所有的操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全的移植。不是所有的位都能用于所有的系统,唯一共有的是用于表示目录的ModeDir位。
const ( // 单字符是被String方法用于格式化的属性缩写。 ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录 ModeAppend // a: 只能写入,且只能写入到末尾 ModeExclusive // l: 用于执行 ModeTemporary // T: 临时文件(非备份文件) ModeSymlink // L: 符号链接(不是快捷方式文件) ModeDevice // D: 设备 ModeNamedPipe // p: 命名管道(FIFO) ModeSocket // S: Unix域socket ModeSetuid // u: 表示文件具有其创建者用户id权限 ModeSetgid // g: 表示文件具有其创建者组id的权限 ModeCharDevice // c: 字符设备,需已设置ModeDevice ModeSticky // t: 只有root/创建者能删除/移动文件 // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位) )
返回值:
file
: 指向打开或创建的文件的指针err
: 可能发生的错误
示例:
file, err := os.OpenFile("example.txt", os.O_RDWR|os.O_CREATE, 0644) if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件
func NewFile(fd uintptr, name string) *File
作用:根据文件描述符和名称创建一个新的File
对象
参数:
fd
: 文件描述符name
: 文件名
返回值:
- 返回一个指向新
File
对象的指针
示例:
fd := os.Open("example.txt") file := os.NewFile(fd.Fd(), "example.txt") defer file.Close() // 确保在函数结束时关闭文件
func Pipe() (r *File, w *File, err error)
作用:创建一个管道并返回一对文件对象,分别用于读取和写入
返回值
r
: 用于读取管道的文件对象w
: 用于写入管道的文件对象err
: 可能发生的错误
示例:
r, w, err := os.Pipe() if err != nil { fmt.Println("Error creating pipe:", err) return } defer r.Close() // 确保在函数结束时关闭管道读取端 defer w.Close() // 确保在函数结束时关闭管道写入端
文件属性查询
func (f *File) Name() string
作用:返回文件的名称
返回值:
string
返回一个字符串,表示文件的名称
示例:
file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 name := file.Name() fmt.Println("File name:", name)
func (f *File) Stat() (fi FileInfo, err error)
作用:获取文件的状态信息,包括文件大小、创建时间、修改时间、访问时间等
返回值:
fi
: 一个FileInfo
类型的结构体,包含文件的状态信息,如大小、创建时间、修改时间等err
: 如果在获取文件状态信息时发生错误,返回一个错误
file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 fileInfo, err := file.Stat() if err != nil { fmt.Println("Error getting file info:", err) return } fmt.Println("File size:", fileInfo.Size())
func (f *File) Fd() uintptr
作用:返回文件的描述符
返回值:
- 返回一个
uintptr
类型的值,表示文件的描述符。在Unix系统中,这个描述符可以用于执行一些底层的文件操作
file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 fd := file.Fd() fmt.Println("File descriptor:", fd)
目录操作
func (f *File) Readdir(n int) (fi []FileInfo, err error)
作用:读取目录内容,返回文件信息列表
输入值:
n
: 可选参数,指定返回的文件信息列表的最大长度。如果为0,将返回所有文件信息
返回值:
fi
: 一个[]FileInfo
类型的切片,包含目录中的文件信息err
: 如果在读取目录内容时发生错误,返回一个错误值
示例:
// 使用Readdir方法读取目录内容并打印文件信息 func printDirectoryInfo(dirName string) { dir, err := os.Open(dirName) if err != nil { fmt.Println("Error opening directory:", err) return } defer dir.Close() // 确保在函数结束时关闭目录 // 读取目录内容,返回文件信息列表 dirFiles, err := dir.Readdir(0) if err != nil { fmt.Println("Error reading directory:", err) return } for _, f := range dirFiles { fmt.Println("File:", f.Name(), "Size:", f.Size(), "Mode:", f.Mode(), "ModTime:", f.ModTime()) } }
func (f *File) Readdirnames(n int) (names []string, err error)
作用:读取目录内容,返回文件名列表
输入值:
n
: 可选参数,指定返回的文件名列表的最大长度。如果为0,将返回所有文件名
返回值:
names
: 一个[]string
类型的切片,包含目录中的文件名err
: 如果在读取目录内容时发生错误,返回一个错误值
示例:
// 使用Readdirnames方法读取目录内容并打印文件名 func printDirectoryNames(dirName string) { dir, err := os.Open(dirName) if err != nil { fmt.Println("Error opening directory:", err) return } defer dir.Close() // 确保在函数结束时关闭目录 // 读取目录内容,返回文件名列表 dirNames, err := dir.Readdirnames(0) if err != nil { fmt.Println("Error reading directory names:", err) return } for _, name := range dirNames { fmt.Println("File name:", name) } }
文件内容操作
func (f *File) Read(b []byte) (n int, err error)
作用:从文件中读取数据
输入值:
b
: 一个字节切片,用于存储从文件中读取的数据
返回值:
n
: 实际读取的字节数err
: 如果读取操作失败,返回一个错误值*
示例:
func main() { // 打开一个已存在的文件用于读取 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 创建一个足够大的缓冲区来存储读取的数据 buffer := make([]byte, 100) // 从文件中读取数据 n, err := file.Read(buffer) if err != nil { fmt.Println("Error reading file:", err) return } // 打印读取到的数据 fmt.Println("Read ", n, " bytes:", string(buffer)) }
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
作用:从文件的指定偏移量读取数据
输入值:
b
: 一个字节切片,用于存储从文件中读取的数据off
: 起始偏移量,表示从文件中的哪个位置开始读取
返回值:
n
: 实际读取的字节数err
: 如果读取操作失败,返回一个错误值
示例:
func main() { // 打开一个已存在的文件用于读取 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 创建一个足够大的缓冲区来存储读取的数据 buffer := make([]byte, 100) // 从文件的指定偏移量读取数据 n, err := file.ReadAt(buffer, 50) if err != nil { fmt.Println("Error reading file:", err) return } // 打印读取到的数据 fmt.Println("Read ", n, " bytes at offset 50:", string(buffer)) }
func (f *File) Write(b []byte) (n int, err error)
作用:将数据写入文件
输入值:
b
: 一个字节切片,包含要写入文件的数据
返回值:
n
: 实际写入的字节数err
: 如果写入操作失败,返回一个错误值
示例:
func main() { // 打开一个已存在的文件用于写入 file, err := os.Open("example.txt", os.O_RDWR) if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 将数据写入文件 n, err := file.Write([]byte("Hello, World!")) if err != nil { fmt.Println("Error writing to file:", err) return } // 打印写入的字节数 fmt.Println("Wrote ", n, " bytes to file") }
func (f *File) WriteString(s string) (ret int, err error)
作用:将字符串写入文件。
输入值:
s
: 要写入的字符串。
返回值:
ret
: 实际写入的字节数。err
: 如果写入操作失败,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件用于写入 file, err := os.Open("example.txt", os.O_RDWR) if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 将字符串写入文件 n, err := file.WriteString("Hello, World!") if err != nil { fmt.Println("Error writing to file:", err) return } // 打印写入的字节数 fmt.Println("Wrote ", n, " bytes to file") }
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
作用:将数据写入文件的指定偏移量。
输入值:
b
: 一个字节切片,包含要写入文件的数据。off
: 起始偏移量,表示从文件中的哪个位置开始写入
返回值:
n
: 实际写入的字节数err
: 如果写入操作失败,返回一个错误值
示例:
func main() { // 打开一个已存在的文件用于写入 file, err := os.Open("example.txt", os.O_RDWR) if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 将数据写入文件的指定偏移量 n, err := file.WriteAt([]byte("Hello, World!"), 50) if err != nil { fmt.Println("Error writing to file:", err) return } // 打印写入的字节数 fmt.Println("Wrote ", n, " bytes to file at offset 50") }
文件位置调整
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
作用:移动文件指针到一个新的位置
输入值:
offset
: 偏移量,表示从当前文件指针的位置移动多少字节whence
: 参考点,用于解释offset
的值。可能的值包括:io.SeekStart
: 从文件开始处计算偏移量io.SeekCurrent
: 从当前文件指针的位置计算偏移量io.SeekEnd
: 从文件末尾处计算偏移量
返回值:
ret
: 返回新的文件指针位置。err
: 如果移动文件指针时发生错误,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 将文件指针移动到文件末尾 _, err = file.Seek(0, io.SeekEnd) if err != nil { fmt.Println("Error seeking file:", err) return } // 写入一些内容到文件末尾 _, err = file.WriteString("Hello, World!") if err != nil { fmt.Println("Error writing to file:", err) return } // 强制将所有未写入的数据写入磁盘 err = file.Sync() if err != nil { fmt.Println("Error syncing file:", err) return } fmt.Println("Content written to the end of the file") }
文件系统操作
func (f *File) Chdir() error
作用:更改当前工作目录到文件所在的目录
返回值:
err
: 如果更改当前工作目录时发生错误,返回一个错误值
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 更改当前工作目录到文件所在的目录 err = file.Chdir() if err != nil { fmt.Println("Error changing directory:", err) return } // 当前工作目录已更改,可以继续操作文件系统 fmt.Println("Current working directory changed to file's directory") }
func (f *File) Chmod(mode FileMode) error
作用:更改文件的权限模式。
输入值:
mode
: 一个新的权限模式,是一个FileMode
类型的值。
返回值:
err
: 如果更改文件权限时发生错误,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 更改文件的权限模式 err = file.Chmod(0644) if err != nil { fmt.Println("Error changing file mode:", err) return } // 文件权限已更改 fmt.Println("File mode changed to 0644") }
func (f *File) Chown(uid, gid int) error
作用:更改文件的所有者和组。
输入值:
uid
: 新的文件所有者的用户ID。gid
: 新的文件所有者的组ID。
返回值:
err
: 如果更改文件所有者和组时发生错误,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 更改文件的所有者和组 err = file.Chown(1000, 1000) if err != nil { fmt.Println("Error changing file ownership:", err) return } // 文件所有者和组已更改 fmt.Println("File ownership changed to user 1000 and group 1000") }
func (f *File) Truncate(size int64) error
作用:截断文件到指定大小。
输入值:
size
: 新的文件大小,以字节为单位。
返回值:
err
: 如果截断文件时发生错误,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 截断文件到指定大小 err = file.Truncate(50) if err != nil { fmt.Println("Error truncating file:", err) return } // 文件已截断到指定大小 fmt.Println("File truncated to 50 bytes") }
文件同步和关闭
func (f *File) Sync() (err error)
作用:强制将所有未写入的数据写入磁盘。
返回值:
err
: 如果写入操作失败,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt", os.O_RDWR) if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 确保在函数结束时关闭文件 // 将一些内容写入文件 _, err = file.Write([]byte("Hello, World!")) if err != nil { fmt.Println("Error writing to file:", err) return } // 强制将所有未写入的数据写入磁盘 err = file.Sync() if err != nil { fmt.Println("Error syncing file:", err) return } fmt.Println("Content written to the file and synced") }
func (f *File) Close() error
作用:关闭文件,释放资源。
返回值:
err
: 如果关闭文件时发生错误,返回一个错误值。
示例:
func main() { // 打开一个已存在的文件 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } // 对文件进行操作... // 关闭文件 err = file.Close() if err != nil { fmt.Println("Error closing file:", err) return } fmt.Println("File closed successfully") }