文件和目录操作是编程中非常基础且常用的部分,涉及到文件的创建、读写、删除以及目录的创建、删除等功能。下面是文件和目录操作的汇总整理,包括常见的API及其用途:
文件操作
POSIX 系统(如 Linux 和 macOS)
-
打开文件:
open(const char *pathname, int flags[, mode_t mode])
: 打开或创建文件。fopen(const char *path, const char *mode)
: 用于文本文件的高级接口。
-
读取文件:
read(int filedes, void *buf, size_t nbyte)
: 从文件描述符读取数据。fgets(char *str, int n, FILE *stream)
: 从文件读取一行字符串。
-
写入文件:
write(int filedes, const void *buf, size_t nbyte)
: 向文件描述符写入数据。fprintf(FILE *stream, const char *format, ...)
: 格式化输出到文件。
-
关闭文件:
close(int filedes)
: 关闭文件描述符。fclose(FILE *stream)
: 关闭文件流。
-
文件定位:
lseek(int filedes, off_t offset, int whence)
: 移动文件位置指示器。fseek(FILE *stream, long offset, int whence)
: 移动文件位置指示器(用于文本文件)。
-
文件状态:
fstat(int filedes, struct stat *buf)
: 获取文件的状态。fstatfs(int filedes, struct statfs *buf)
: 获取文件系统的状态。
-
文件属性:
chmod(const char *pathname, mode_t mode)
: 更改文件权限。chown(const char *pathname, uid_t owner, gid_t group)
: 更改文件的所有者和组。
-
文件删除:
remove(const char *pathname)
: 删除文件。
-
文件重命名:
rename(const char *oldpath, const char *newpath)
: 重命名文件。
目录操作
POSIX 系统(如 Linux 和 macOS)
-
创建目录:
mkdir(const char *pathname, mode_t mode)
: 创建目录。
-
删除目录:
rmdir(const char *pathname)
: 删除空目录。
-
遍历目录:
opendir(const char *name)
: 打开目录流。readdir(DIR *dirp)
: 读取目录流中的条目。closedir(DIR *dirp)
: 关闭目录流。
Windows 系统
-
打开文件:
CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
: 创建或打开文件。
-
读取文件:
ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
: 从文件读取数据。
-
写入文件:
WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
: 向文件写入数据。
-
关闭文件:
CloseHandle(HANDLE hObject)
: 关闭文件句柄。
-
文件定位:
SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod)
: 移动文件指针。
-
文件状态:
GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
: 获取文件大小。GetFileAttributesA(LPCSTR lpFileName)
: 获取文件属性。
-
文件属性:
SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes)
: 更改文件属性。
-
文件删除:
DeleteFileA(LPCSTR lpFileName)
: 删除文件。
-
文件重命名:
MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName)
: 重命名或移动文件。
-
创建目录:
CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
: 创建目录。
-
删除目录:
RemoveDirectory(LPCSTR lpPathName)
: 删除空目录。
-
遍历目录:
FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
: 开始遍历目录。FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
: 遍历下一个文件。FindClose(HANDLE hFindFile)
: 结束遍历。
示例代码
以下是一个简单的示例,展示如何在 Linux 或 macOS 系统上使用 C 语言创建文件、写入内容、然后关闭文件:
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6
7int main() {
8 char filename[] = "example.txt";
9 int filedes;
10 char text[] = "Hello, world!";
11
12 // 创建文件
13 filedes = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
14 if (filedes == -1) {
15 perror("无法创建文件");
16 exit(EXIT_FAILURE);
17 }
18
19 // 写入内容
20 if (write(filedes, text, strlen(text)) == -1) {
21 perror("无法写入文件");
22 close(filedes);
23 exit(EXIT_FAILURE);
24 }
25
26 // 关闭文件
27 if (close(filedes) == -1) {
28 perror("无法关闭文件");
29 exit(EXIT_FAILURE);
30 }
31
32 return 0;
33}
注意事项
- 在进行文件操作时,务必检查函数的返回值以确保操作成功。
- 使用文件后记得及时关闭,以释放系统资源。
- 对于二进制文件,应使用
fopen
的"rb"
和"wb"
模式。 - 在处理大文件时,考虑使用缓冲或分块读取以提高效率。
- 跨平台编程时要注意不同操作系统之间的 API 差异。
文件和目录操作是编程中的基本组成部分,几乎所有的应用程序都会涉及到这些操作。理解和熟练掌握这些操作对于编写可靠、高效的程序至关重要。