Портативный способ проверить, существует ли каталог [Windows/Linux, C]
Я хочу проверить, существует ли данный каталог. Я знаю, как это сделать в Windows:
BOOL DirectoryExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
и Linux:
DIR* dir = opendir("mydir");
if (dir)
{
/* Directory exists. */
closedir(dir);
}
else if (ENOENT == errno)
{
/* Directory does not exist. */
}
else
{
/* opendir() failed for some other reason. */
}
Но мне нужен переносимый способ сделать это. Есть ли способ проверить, существует ли каталог независимо от того, какую ОС я использую? Может быть, стандартный способ библиотеки?
Я знаю, что я могу использовать директивы препроцессоров и вызывать эти функции на разных ОС, но это не решение, которое я прошу.
Я КОНЕЦ С ЭТИМ, МЕНЬШЕ ТЕПЕРЬ:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int dirExists(const char *path)
{
struct stat info;
if(stat( path, &info ) != 0)
return 0;
else if(info.st_mode & S_IFDIR)
return 1;
else
return 0;
}
int main(int argc, char **argv)
{
const char *path = "./TEST/";
printf("%d\n", dirExists(path));
return 0;
}
Ответы
Ответ 1
stat() работает и в Linux., UNIX и Windows:
#include <sys/types.h>
#include <sys/stat.h>
struct stat info;
if( stat( pathname, &info ) != 0 )
printf( "cannot access %s\n", pathname );
else if( info.st_mode & S_IFDIR ) // S_ISDIR() doesn't exist on my windows
printf( "%s is a directory\n", pathname );
else
printf( "%s is no directory\n", pathname );
Ответ 2
Используйте boost:: filesystem, что даст вам переносимый способ делать такие вещи и абстрагироваться от всех уродливых деталей для вас.
Ответ 3
Вы можете использовать GTK glib для абстрактной работы с ОС.
glib предоставляет функцию g_dir_open(), которая должна делать трюк.