检查 C 中是否存在具有部分名称的文件
check if file exists with a partial name in C
我知道一个文件的目录,但我只有部分文件名。如何检查此文件是否存在于 C
例如:
/tmp/God_of_War
文件名实际调用:
/tmp/God_of_War_PSP(USA).rar
这在可移植的 C 中是不可能的,因为 C 标准库没有用于枚举目录中文件(然后自己匹配它们)的 API 更不用说用于匹配文件名的 API一种模式。这是因为 C 早于分层目录的现代概念(甚至是 1984 年的原始 Macintosh didn't support subdirectories)——并且因为 C 至今仍支持这些系统(想想:微控制器)。
在实践中,您将使用您平台的文件系统 API:在 Unix-like/POSX 系统上,包括 Linux,这是用 dirent.h
完成的 - 对于您的问题,您特别d 使用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 上,可以使用通配符的 FindFirstFile
和 FindNextFile
,就像 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
}
}
我知道一个文件的目录,但我只有部分文件名。如何检查此文件是否存在于 C
例如:
/tmp/God_of_War
文件名实际调用:
/tmp/God_of_War_PSP(USA).rar
这在可移植的 C 中是不可能的,因为 C 标准库没有用于枚举目录中文件(然后自己匹配它们)的 API 更不用说用于匹配文件名的 API一种模式。这是因为 C 早于分层目录的现代概念(甚至是 1984 年的原始 Macintosh didn't support subdirectories)——并且因为 C 至今仍支持这些系统(想想:微控制器)。
在实践中,您将使用您平台的文件系统 API:在 Unix-like/POSX 系统上,包括 Linux,这是用 dirent.h
完成的 - 对于您的问题,您特别d 使用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 上,可以使用通配符的 FindFirstFile
和 FindNextFile
,就像 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
}
}