目录的创建与删除
C语言标准函数库没有提供目录的创建、删除,遍历等功能函数,开发者可以通过调用操作系统提供的系统API函数来实现目录的创建、删除等功能。
在类Unix系统(如Linux和macOS)中,创建目录的系统API函数是mkdir函数,在Winodws操作系统中,创建目录的函数是_mkdir或CreateDirectory函数。
下面的代码段展示了如何在Linux和Windows系统上创建目录,由于Linux和Windows使用不同的系统函数和路径分隔符,代码使用了预处理器指令根据不同操作系统编译不同的代码段。
#include <direct.h>
#include <windows.h>
#ifdef _WIN32
#define MKDIR(path) _mkdir(path)
#else
#define MKDIR(path) mkdir(path, 0755)
#endif
int main() {
// 定义要创建的目录路径
char directoryPath[100] = "example_directory";
// 尝试创建目录
if (MKDIR(directoryPath) != 0) {
// 如果创建失败,输出错误信息
perror("Error creating directory");
return EXIT_FAILURE;
}
// 输出成功信息
printf("Directory '%s' created successfully.\n", directoryPath);
// 删除创建的目录
#ifdef _WIN32
_rmdir(directoryPath);
#else
rmdir(directoryPath);
#endif
printf("Directory '%s' deleted successfully.\n", directoryPath);
return EXIT_SUCCESS;
}
在程序中若定义了_WIN32,编译平台为Windows操作系统,否则编译平台为Linux系统。MKDIR宏根据编译平台调用不同的函数来创建目录,在Windows上使用 _mkdir函数,在Linux系统使用mkdir函数。main 函数内定义了要创建的目录路径 directoryPath,使用 MKDIR 宏尝试创建目录,并检查返回值,如果返回非零值,表示创建失败,使用 perror 打印错误信息,如果目录创建成功,则输出成功信息。
在程序结束前,使用 _rmdir(Windows)或 rmdir(Linux)来删除创建的目录,并输出删除成功的信息。
在Linux或类Unix系统上,可以使用gcc编译器编译并运行程序。
目录切换操作
C程序在运行过程中,有时需要对当前工作目录(程序所在目录)进行切换。C语言提供了chdir函数用于改变当前程序的工作目录,函数原型在<unistd.h>头文件中定义。
函数原型
int chdir(const char *path);
chdir函数接受一个参数,该参数指向要切换的目录路径,如果切换成功返回0;则返回-1。
下面的代码段展示了如何使用chdir函数来切换当前工作目录。
#include <errno.h>
#include <string.h>
int main() {
// 要切换到的目录路径
const char *new_directory = "c:\\test";
// 使用chdir函数切换目录
if (chdir(new_directory) == 0) {
printf("Successfully changed directory to %s\n", new_directory);
} else {
// 如果chdir失败,打印错误信息
perror("Error changing directory");
return 1; // 返回非零值表示程序异常退出
}
return 0; // 返回0表示程序正常退出
}
上面的示例代码定义了一个常量new_directory,指向要切换的目录路径(需要检查该目录是否存在)。然后调用chdir函数并检查其返回值。如果返回值是0,打印成功信息,否则打印错误信息。
遍历目录操作
使用C语言编写磁盘目录遍历程序,需要使用操作系统提供的API函数。在Unix和Linux系统中,可以使用opendir、readdir和closedir等函数来遍历目录;在Windows系统中,则可以使用FindFirstFile、FindNextFile和FindClose等函数。
Windows操作系统目录遍历案例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
void traverse_directory(const char* path) {
char full_path[MAX_PATH];
WIN32_FIND_DATA find_data;
HANDLE hFind;
// 使用Windows API的FindFirstFile函数来查找目录中的第一个文件或子目录
hFind = FindFirstFile(path, &find_data);
if (hFind == INVALID_HANDLE_VALUE) {
fprintf(stderr, "FindFirstFile failed: %d\n", GetLastError());
return;
}
do {
// 跳过当前目录和父目录
if (strcmp(find_data.cFileName, ".") == 0 || strcmp(find_data.cFileName, "..") == 0) {
continue;
}
// 构建完整的文件或子目录路径
//snprintf(full_path, sizeof(full_path), "%s\\%s", path, find_data.cFileName);
strcat(full_path,path);
strcat(full_path,"\\");
strcat(full_path,find_data.cFileName);
// 如果是目录,则递归遍历
if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (strcmp(find_data.cFileName, ".") != 0 && strcmp(find_data.cFileName, "..") != 0) {
printf("Directory: %s\n", full_path);
traverse_directory(full_path);
}
} else {
// 否则,打印文件名
printf("File: %s\n", full_path);
}
} while (FindNextFile(hFind, &find_data));
// 关闭查找句柄
FindClose(hFind);
}
int main() {
const char* directory_path = "D:\\sample"; // 替换成你的目录路径
// 遍历目录
traverse_directory(directory_path);
return 0;
}
在上面的示例中,traverse_directory函数接收一个目录路径作为参数,并递归地遍历该目录下的所有文件和子目录。对于每个遍历到的目录,递归调用自身;对于每个遍历到的文件,打印出文件的完整路径。
在Unix/Linux系统中,可以使用以下步骤来遍历目录:
步骤1:打开目录
使用opendir函数打开目录,返回一个DIR类型的指针。
#include <dirent.h>
DIR *dir;
dir = opendir("/path/to/directory");
if (dir == NULL) {
perror("opendir");
return -1;
}
步骤2:读取目录项
使用readdir函数从目录中读取下一个目录项,返回一个struct dirent类型的指针。
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name)
}
步骤3:关闭目录
使用closedir函数关闭目录。
closedir(dir);