Разделы сайта:
Статьи по C и C++Стандартная библиотека CКнигиЮмор
Работа с файлами на диске

Внимание! Приведенные ниже функции не являются частью стандарта, а значит их нет во всех компиляторах.

Часть 2. Получение информации о файле.

Так как ФС помимо имени файла хранит еще много различных параметров, я приведу несколько методов получения их. Первый - использование поиска файлов по маске. Для не обязательно иметь конкретное имя файла.

Поиск файлов по маске

Для того, чтобы создать свой файловый броузер программисты используют метод, называемый поиском файлов по маске. Он заключается в том, что в текущей папке находятся все файлы, удовлетворяющие данной маске. При каждом новом вызове функций программа получает данные о следующем файле. Как правило, для реализации этого метода требуется три функции:
- Инициализация поиска. Поиск первого файла.
- Поиск n-нного файла (в цикле)
- Завершение поиска.

Для операционной системы MSDOS этими функциями соответственно являются _dos_findfirst, _dos_findnext. Заключительная функция отсутствует, поиск завершает _dos_findnext. Если Вы примените этот метод в Win32, Вам потребуются функции WinAPI FindFirstFile, FindNextFile, FindClose. Для UNIX - систем следует воспользоваться библиотекой dirent.h и функциями opendir, readdir, closedir и rewinddir. Нже будет рассмотрен пример для DOS.

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

struct find_t {
   char reserved[21];     /* резерв */
   char attrib;           /* атрибуты файла */
   int wr_time;           /* время создания */
   int wr_date;           /* дата создания */
   long size;             /* размер файла */
   char name[13];         /* имя 8.3 */
};

unsigned findfirst(const char *pathname, int attrib,
                        struct find_t *ffblk);
/* В некоторых компиляторах - _dos_findfirst */

Маской является приблизительное наименование файла, например:

Маска Объяснение
*.* Все файлы с расширением
* Все файлы
*.txt Все файлы txt
????? Файлы с именем из пяти букв
*.? Все файлы с расширением из одной буквы
a* Все файлы, начинающиеся с буквы 'a'
a?? Все файлы с именем из трех букв, первая из которых 'a'
В качестве параметра attrib передаются параметры (атрибуты) файла. Они могут объединяться: FA_HIDDEN | FA_RDONLY. Следует обратиться к справке вашего компилятора, чтобы узнать полный список названий атрибутов.

Атрибут Альтернативное название Объяснение
FA_NORMAL _A_NORMAL Нормальный
FA_RDONLY _A_RDONLY Только для чтения
FA_HIDDEN _A_HIDDEN Скрытый
FA_SYSTEM _A_SYSTEM Системный
FA_LABEL _A_VOLID Метка тома
FA_DIREC _A_SUBDIR Папка
FA_ARCH _A_ARCH Архивный

Когда найден первый файл, следует вызвать функцию findnext.

/* В некоторых компиляторах - _dos_findnext */
unsigned findnext(struct find_t *ffblk);

Вот пример поиска файлов в текущей папке (MSDOS/BC5).

   find_t files[128]; /*До 128 файлов*/
  struct find_t ffblk; 
  int maxfiles = 0; 
  int done;
  /*Поиск файлов и папок*/ 
  done = _dos_findfirst("*.*",_A_NORMAL|_A_SUBDIR,&ffblk); 
  while (!done) {
    maxfiles++;
    if(maxfiles==120) break;
    memcpy(&files[maxfiles],&ffblk, sizeof(find_t));
    done = _dos_findnext(&ffblk);
  }

Функции stat, fstat

Второй метод - файловая статистика. В С она реализована с помощью функций fstat (stat)

int fstat(int handle, struct stat *statbuf);
int stat(const char *path, struct stat *statbuf);
int _wstat(const wchar_t *path, struct stat *statbuf);

Главое отличие fstat от stat заключается в том, что для нее имя файла не обязательно, а достаточно дескриптора (про дескрипторы мы говорили во вотрой части статьи). Второй параметр - указатель на структуру, хранящую файловую статистику. Эта структура принимает такой вид:
struct  stat
{
    short st_dev;     //Дескриптор устройства или номер файла на диске
    short st_ino;
    short st_mode;   //Режим дескриптора
    short st_nlink;
    int   st_uid;
    int   st_gid;
    short st_rdev;
    long  st_size;    //Размер в байтах
	//Файловое время: 
    long  st_atime;   //для NTFS/HPFS - время последнего доступа к файлу
    long  st_mtime;  //для NTFS/HPFS - время последней модификации файла
    long  st_ctime;  //для NTFS/HPFS - время создания файла
};
Для того, чтобы проверить режим дескриптора также объявлены макросы:
S_ISDIR(m) - проверяет на директорию
S_ISCHR(m) - проверяет на устройство
S_ISBLK(m) - проверяет на специальный тип блока
S_ISREG(m) - проверяет на файл
S_ISFIFO(m) - проверяет на специальный режим FIFO

Проверка каждого аттрибута по-отдельности

Для некоторых аттрибутов проверку можно провести специальными функциями, например filelength возвращает длину файла handle, getftime позволяет получить дату и время создания файла.

Назад
Автор и разработчик сайта - Кляус Сергей. Спасибо Форуму на Исходниках.RU за помощь в сборе материалов.
X