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

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

Часть 1. Управление файлами и каталогами на диске.

Для работы с файлами и каталогами в стандартной библиотеке С предусмотрена билиотека dir.h Из-за того, что на всех платформах API, отвечающее за эти функции различно, горазда удобнее использовать эти функции, решающие проблему переносимости. Сделаю сразу несколько оговорок. Так как С - мультиплатформенный язык, а UNIX/LINUX не поддерживает систему наименования дисков Windows, то за 0 принимают текущий диск, за 1 диск, соответствущий в Windows/DOS путю 'A:', 2 - 'B:' и т. д. Если вы работаете в среде DOS, Вы можете заметить, что некоторые функции переопределены с префиксом _dos. Для их использования необходимо подключить заголовочный файл dos.h Для некоторых функций может потребоваться stdio.h

#include <io.h>
#include <dir.h>

Управление именами файлов

Для того, чтобы сформировать путь или поделить его на строки, содержащие устройство (диск), каталог, имя файла и расширение, необходимо использовать соответсвенно функции fnmege (File Name MERGE) и fnsplit (File Name SPLIT) Давайте раcсмотрим их прототипы:

void fnmerge(char *path, const char *drive, const char *dir, 
	const char *name, const char *ext);
void _wfnmerge(wchar_t *path, const wchar_t *drive, const wchar_t *dir, 
				const wchar_t *name, const wchar_t *ext );

int fnsplit(const char *path, char *drive, char *dir, char *name, 
				char *ext);
int _wfnsplit(const wchar_t *path, wchar_t *drive, wchar_t *dir, 
				wchar_t *name, wchar_t *ext );
Длина строк, используемых в этих функциях ограничена. По стандартам ANSI C она равна:
Константа 16 бит 32 бита Описание
MAXPATH 80 256 Путь
MAXDRIVE 3 3 Устройство, включая двоеточие.
MAXDIR 66 260 Каталог, включая начальные и конечные обратные слеши (\)
MAXFILE 9 256 Имя, без расширения
MAXEXT 5 256 Расширение, включает точку

Таким образом, чтобы использовать эти функции, необходимо объявить массивы строк длиной в MAX* символов:

   char path[MAXPATH];
   strcpy(path, "C:\\WinNT\\explorer.exe");   
   /*path содержит C:\WinNT\explorer.exe*/
   char drive[MAXDRIVE];
   char dir[MAXDIR];
   char file[MAXFILE];
   char ext[MAXEXT];
   fnsplit(path,drive,dir,file,ext);
   /*  Переменная Значение
    *  drive            c:
    *  dir               \WinNT\
    *  file              explorer 
    *  ext              .exe           */
   file[0]=0;       /*Очистка имени файла и разширения*/
   ext[0]=0;
   /*Теперь в path строка C:\WinNT\*/
   fnmerge(path,drive,dir,file,ext);   

Для переименования или переименования файла на диске применяют функцию rename.

int rename(const char *oldname, const char *newname);
int _wrename(const wchar_t *oldname, const wchar_t *newname);
Эта функция перемещает/переименовывает файл из пути oldname в newname и возращает -1 или нуль, если операция проведена успешно.

  • Я настоятельно рекомендую Вам пользоваться ограничениями MAX* во избежание недоразумений
  • По причине того, что в С обратный слеш (\) используется для внутренних целей, при объявлении пути слеш удваивают.

Создание и удаление файлов и каталогов

Для того, чтобы создать каталог достаточно вызова функции mkdir. Ее преимущество в том, что если в нее передать дополнительный параметр, она доступна в UNIX-системах. Единственный ее параметр - путь к каталогу.

int mkdir(const char *path);
int _wmkdir(const wchar_t *path);
Как и функция rename, при ошибке она возвращает -1, а при успехе - 0.

Для того, чтобы удалить созданный раннее каталог достаточно вызова rmdir. К каталогу, который удаляем предъявляются три требования:
- он должен буть пустым
- он не является текущей рабочей директорией
- он не является корневым каталогом

int _rmdir(const char *path);
int _wrmdir(const wchar_t *path);

Для того, чтобы создать файл на диске, используйте функцию _creat, которая создает новый или обрезает существующий файл. Она, как и многие функции io.h работает с файлами с помощью "хэндлов", и поэтому после нее следует вызвать функцию close. Тип файла (текстовый или двоичный) задается глобальной переменной _fmode (O_TEXT или O_BINARY соответственно). Если вы не хотите обрезать старый файл, воспользуйтесь функцией creatnew.

int creatnew(const char *path, int mode /*или int attrib*/);
При ошибке возвращает -1, при успехе нуль. Первый параметр указывает на путь к файлу, второй на требуемые аттрибуты:
Атрибут Объяснение
FA_RDONLY Только для чтения
FA_HIDDEN Скрытый
FA_SYSTEM Системный
int _creat(const char *path, int amode);
int _wcreat(const wchar_t *path, int amode);
Первый параметр - путь к создаваемогу файлу, второй - режим файла. Файл пожет быть открыт и для записи, и для чтения, и для обеих операций.
Значение режима Доступ
S_IWRITE Разрешение на запись
S_IREAD Разрешение на чтение
S_IREAD|S_IWRITE Разрешение на запись и чтение
Эти константы храняться в библиотеке sys/stat.h

Для того, чтобы настроить разрешения для каталога (аналогично режиму файла), используйте функцию chmod.

int chmod(const char *path, int amode);
int _wchmod(const wchar_t *path, int amode);
Функция устанавливает режим amode для каталога path.

Для того, чтобы узнать режим файла, используйте функцию access.

int access(const char *filename, int amode);
int _waccess(const wchar_t *filename, int amode);
Определяет возможен ли доступ к файлу filename при режиме amode.
Значение Объяснение
6 Возможно ли чтение и запись
4 Возможно ли чтение
2 Возможна ли запись
1 Выполнение (игнорируется)
0 Проверить только на наличие
Функция access возвращает значение 0, если файл имеет заданный режим mode. Возвращаемое значение -1 свидетельствует о том, что названный файл не существует или недоступен в заданном amode.

Существует два способа удалить файл: через функцию _unlink или remove.

int remove(const char *filename);
int _wremove(const wchar_t *filename);
Функция удаляет файл filename и возвращает нуль при успехе. Ее аналог - функция _unlink еще не утверждена стандартом ANSI C.
int _unlink(const char *filename);
int _wunlink(const wchar_t *filename);
Замечание: если файл открыт, следует закрыть его перед удалением.

Автор: myaut.

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