Как узнать, является ли файл каталогом (оптимальный способ) - PullRequest
1 голос
/ 21 октября 2011

Я работаю в независимом от ОС файловом менеджере, и у меня возникла проблема с правильным определением, является ли файл каталогом или нет в Windows.Структура dirent в окнах, похоже, не имеет поля DT_DIR, поэтому я использую:

file_attributes=GetFileAttributes(ep->d_name);
if(file_attributes & FILE_ATTRIBUTE_DIRECTORY)files_list[i].is_dir=1;
else files_list[i].is_dir=0;

Однако это не всегда точно, так как некоторые файлы помечаются как каталоги (длянапример, pagefile.sys).Кроме того, GetFileAttributes довольно медленный, если у вас много файлов.

У меня также есть функция:

int does_dir_exist(char *path)
{
DIR *dp_test;

dp_test = opendir(path);
if(dp_test)
    {
        return 1;
        closedir(dp_test);
    }

return 0;
  }

Но это довольно медленно (не будет хорошей идеейчтобы сделать это на 10000 файлов).

Конечно, я могу комбинировать оба, что было бы довольно быстро, но есть ли лучший способ?

PS По какой-то причине не могу отформатировать кодправильно для второй функции.

Ответы [ 2 ]

5 голосов
/ 21 октября 2011

Просто используйте GetFileAttributes(). opendir и closedir не будут ускоряться (вы профилировали это? Повторяли ли вы свои тесты, чтобы избежать эффектов кэширования?).

Да, GetFileAttributes() является точным. Причина, по которой вы думаете, что это ошибка, заключается в том, что когда вы пытаетесь получить атрибуты pagefile.sys, он терпит неудачу и возвращает INVALID_FILE_ATTRIBUTES, то есть (DWORD)-1. Когда вы проверяете это с FILE_ATTRIBUTE_DIRECTORY, он возвращает true, потому что -1 имеет каждый установленный бит.

На скольких файлах вы запускаете это? Какую бы функцию вы ни использовали, это будет операция ввода-вывода, поскольку для определения атрибутов файла родительский каталог должен читаться с диска (или дискового кэша).

1 голос
/ 21 октября 2011
_wfinddata_t fd;
_wfindfirst
_wfindnext
_findclose

Если вы используете эти методы для определения элементов в папке, вы получите результат GetFileAttributes бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...