C语言判断文件所在路径和目录是否存在,不存在则创建

7 篇文章 0 订阅

在编程的时候,我们经常会需要生成一些文件,而这些文件为了方便管理,会创建多级目录,有的时候文件所在的目录没有创建,比较麻烦,直接上代码

#ifdef WIN32

// 核查目录,若目录不存在,创建目录
bool GF_FindOrCreateDirectory( const char* pszPath )
{
    WIN32_FIND_DATA fd;
    HANDLE hFind = ::FindFirstFile( pszPath, &fd );
    while( hFind != INVALID_HANDLE_VALUE )
            {
                
            if ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
            {
                ::FindClose(hFind);
                return true;
            }
    }

    if ( !::CreateDirectory( pszPath, NULL ) )
   {
            char szDir[MAX_PATH];
            sprintf_s( szDir, sizeof(szDir), "创建目录[%s]失败,请检查权限", pszPath );
            ::FindClose(hFind);
            return false;
    }
    ::FindClose(hFind);
    return true;
}

// 遍历目录
bool GF_CheckDirectory( char* pszFilePath )
{
    char pszPath[4096];
    strcpy(pszPath,pszFilePath);
    (strrchr(pszPath,'\\'))[1] = 0; 

    vector< std::string > vtPath;

    const char* sep = "\\/";
    char* next_token;
    char* token =  strtok_s( pszPath, sep, &next_token);
    while( token != NULL )
           {
            vtPath.push_back( token );
            token = strtok_s(NULL, sep, &next_token);
    }

    if ( vtPath.size() > 0 )
            {
            if ( vtPath[0] == "." )
                vtPath.erase( vtPath.begin() );
    }

    // 核查所有路径是否存在
    std::string strCurPath;
    for( size_t i = 0; i  < (int)vtPath.size(); ++i )
           {
            strCurPath += vtPath[i];
            if ( !GF_FindOrCreateDirectory( strCurPath.c_str() ) )
                       {
                    return false;
            }
            strCurPath += '\\';
    }

    return true;
}

#else
 

// 核查目录,若目录不存在,创建目录
bool GF_FindOrCreateDirectory( const char* pszPath )
{
    DIR* dir;
    if(NULL==(dir=opendir(pszPath)))
        mkdir(pszPath,0775);

    closedir(dir);
    return true;
}

// 检测文件路径中的目录是否存在,不存在则创建
bool GF_CheckDirectory( char* pszFilePath )
{
    char pszPath[4096];
    strcpy(pszPath,pszFilePath);
    (strrchr(pszPath,'/'))[1] = 0; 

    vector< std::string > vtPath;

    const char* sep = "\\/";
    char* next_token;
    char* token =  strtok_r( pszPath, sep, &next_token);
    while( token != NULL )
    {
        vtPath.push_back( token );
        token = strtok_r(NULL, sep, &next_token);
    }

    if ( vtPath.size() > 0 )
    {
        if ( vtPath[0] == "." )
            vtPath.erase( vtPath.begin() );
    }

    // 核查所有路径是否存在
    std::string strCurPath;
    for( size_t i = 0; i  < (int)vtPath.size(); ++i )
    {
        strCurPath += '/';
        strCurPath += vtPath[i];
        if ( !GF_FindOrCreateDirectory( strCurPath.c_str() ) )
        {
            return false;
        }
        
    }

    return true;
}

#endif

如果不使用 Windows API,也可以使用 C 标准库提供的文件操作函数来创建和修改配置文件。 以下是一个示例代码,可以创建或修改名为 "example.txt" 的配置文件: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LENGTH 1024 int main() { // 设置配置文件路径 const char* file_path = "example.txt"; // 设置配置项名称 const char* section_name = "section"; // 设置配置项值 const char* value = "value"; // 打开文件 FILE* file = fopen(file_path, "r+"); if (!file) { // 如果文件不存在创建文件 file = fopen(file_path, "w"); if (!file) { // 如果创建失败,输出错误信息 printf("Failed to create file\n"); return 1; } } // 读取文件内容 char line_buffer[MAX_LINE_LENGTH]; int section_found = 0; long section_start_pos = 0; long section_end_pos = 0; while (fgets(line_buffer, MAX_LINE_LENGTH, file)) { // 判断是否是配置项所在的行 if (strncmp(line_buffer, section_name, strlen(section_name)) == 0) { section_found = 1; section_start_pos = ftell(file) - strlen(line_buffer); section_end_pos = section_start_pos; } // 记录配置项所在的范围 if (section_found) { section_end_pos = ftell(file); } } // 写入配置项 fseek(file, section_start_pos, SEEK_SET); fprintf(file, "%s=%s\n", section_name, value); fflush(file); // 查询配置项 fseek(file, section_start_pos, SEEK_SET); fgets(line_buffer, MAX_LINE_LENGTH, file); char* value_start = strchr(line_buffer, '=') + 1; char* value_end = strchr(line_buffer, '\n'); *value_end = '\0'; printf("Value: %s\n", value_start); // 关闭文件 fclose(file); return 0; } ``` 在上面的代码中,首先使用 `fopen` 函数打开名为 "example.txt" 的文件。如果文件不存在,就使用 "w" 模式创建文件。接着使用 `fgets` 函数逐行读取文件内容,判断是否找到了配置项所在的行,并记录配置项所在的范围。然后使用 `fseek` 函数定位到配置项所在的位置,使用 `fprintf` 函数写入配置项的值。接着再次使用 `fseek` 函数定位到配置项所在的位置,使用 `fgets` 函数读取配置项的值,并输出查询结果。最后使用 `fclose` 函数关闭文件。 注意,以上代码只是一个示例,实际应用中需要根据具体情况设置配置文件路径、配置项名称和配置项值。同时,需要确保程序有足够的权限来读取和写入配置文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值