【问题标题】:check if file exists with a partial name in C [duplicate]检查文件是否存在C中的部分名称[重复]
【发布时间】:2018-11-23 16:04:30
【问题描述】:

我知道文件的目录,但我只有部分文件名。如何检查该文件是否存在于 C

例如:

/tmp/God_of_War

文件名实际被调用:

/tmp/God_of_War_PSP(USA).rar

【问题讨论】:

    标签: c file-exists


    【解决方案1】:

    这在可移植 C 中是不可能的,因为 C 标准库没有用于枚举目录中的文件(然后自己匹配它们)的 API,更不用说通过模式匹配文件名的 API。这是因为 C 早于分层目录的现代概念(甚至是 1984 年的原始 Macintosh didn't support subdirectories) - 并且因为 C 至今仍支持这些系统(想想:微控制器)。

    在实践中,您会使用平台的文件系统 API:在类 Unix/POSX 系统(包括使用 dirent.h 完成的 Linux)上 - 特别针对您的问题,您将使用 glob 函数:http://pubs.opengroup.org/onlinepubs/009604499/basedefs/glob.h.html

    glob_t result;
    const int ok = glob( "/tmp/God_of_War*", /*flags:*/ 0, /*errfunc:*/ NULL, &result );
    if( 0 == ok ) {
        for( size_t i = 0; i < result.gl_pathc; i++ ) {
            puts( result.gl_pathv[i] );
        }
    }
    else {
        // error
    }
    globfree( &result);
    

    在 Windows 上,FindFirstFileFindNextFile 可以使用通配符,就像 glob

    WIN32_FIND_DATA result;
    HANDLE searchHandle = FindFirstFile( "God_of_War*", &result);
    if( searchHandle == INVALID_HANDLE_VALUE ) {
        // handle error, use GetLastError() for details
    }
    else {
        do {
            puts( searchHandle.cFileName );
        }
        while( FindNextFile( searchHandle, &searchHandle ) );
        DWORD lastError = GetLastError();
        if( lastError != ERROR_NO_MORE_FILES ) {
            // handle error
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 2013-01-19
      • 2013-06-08
      • 1970-01-01
      • 2015-07-24
      • 2010-09-30
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多