Logo

郎哥编程

使用C函数操作文件目录

2024-05-16 56

目录的创建与删除

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);

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论