Основни операции с файловата система UNIX

Одобряване на всичко е файл. представляваща UNIX® философия означава, че работата с файлове и директории непрекъснато се провеждат независимо от кое приложение в момента е извършена работа. Всички данни се съхраняват във файлове: по дата на конфигурационните файлове и данни за устройствата и функциите, които се съдържат в stdio.h системния заглавен файл, вие ще знаете, в рамките на няколко часа от програмиране под UNIX.

Изберете начина, чрез които можете да разглеждате директории и да манипулира файлове, директории и символни връзки, намиращи се в нея, тя е често срещан проблем в страните от начинаещите UNIX-програмисти. Как мога да получа на съдържанието на списъка на директорията и да определи какво означава?

(. Вижте Downloads) Програма за обучение код е показано в тази статия, е написана в Eclipse 3.1 среда с помощта на разширение C / C ++ инструменти за развитие (СОТ); readdir_demo проект проект е проект на тип Сайтът се направи, събрани с помощта на правила за производство на програма от ЦДП. Makefile липсва в проекта, но тя е толкова лесно, че ако трябва да се състави програма извън Eclipse, създаване на Makefile достатъчно лесно.

Eclipse среда (виж ресурси.) - това е чудесен IDE (интегрирана среда за разработка, IDE), който с всяка нова версия става по-добре. Сряда е създаден от разработчиците EMACS и Makefile. Ако до сега не сте използвали Eclipse, трябва да се опита.

Първи съдържание директория

Функция на заглавния файл dirent.h: opendir (). readdir () и closedir () - това е, което ни трябва в тази ситуация. Тяхната употреба е много подобно на използването на функциите отворени / четене / близо при работа с файлове, но с едно изключение: readdir () връща указател към специфична структура (тип структура Дирент) за всеки запис от указателя. Разходка директорията на съдържание, можете да използвате псевдо-код в Обява 1.

Обява 1. Четене на съдържанието на дадена директория

opendir () и readdir () връща NULL. ако има някакъв проблем, както и глобална променлива errno е записан причина за проблема. Ако readdir () връща NULL и errno е 0 (или по друг начин, или ЕОК ENOERROR), това означава, че каталогът е не повече записи.

Трябва да се отбележи, че всяка директория съдържа записи "." (A указател към самата директория) и "." (A показалка предната директория). В зависимост от задачите, свързани с преработката на тези два записа, може да сте пропуснали.

Имайте предвид, че функцията readdir () не е с резба, като се върна структура е статична променлива, която се съхранява в библиотеката на функция. Повечето съвременни UNIX-базирани системи поддържат многонишково readdir_r (функция). който може да се използва вместо за написването на многонишковите код.

Какво е в структурата на структура Дирент?

POSIX 1003.1 стандарт определя само един необходим елемент на структура Дирент структура - масив на овъгляване име d_name. Това е името на директорията на елемента във формата на стандартен NUL-прекратени струни. Всичко останало в структурата зависи от UNIX-система.

Всичко останало. който е в Дирент на структура. Това не е преносим. Съвместими системи не могат да имат и други елементи в конструкцията. Когато създавате код, който използва допълнителни членове на тази структура, трябва да се отбележат тези елементи, за да бъде непоносимо, а в идеалния случай трябва да включва в проекта си код, който прави една и съща операция, но без допълнителните елементи в структура Дирент.

Например, много UNIX системи съдържат d_type област и някои допълнителни константи, които позволяват да се знае вида на запис от указателя без да се налага да се обадя стат (). В допълнение към което премахва необходимостта отново да се обадя на функция е непоносимо разширение избягва отнема много искане на ресурсите на файловата система на подробни метаданни. стат () функция на повечето UNIX-базирани системи, работещи под бавно.

Получаване на информация файл

В допълнение към имената на файловете в директория, в които може да се наложи допълнителна информация, която ще се пояснява в какво да прави по-нататък. Най-малко, можете не само да се разграничат от името на файла от директорията.

Stat () функция запълва структура структура Stat с информация за даден файл; ако има файлов дескриптор вместо име на файла, можете да го използвате в комбинация с fstat (). Ако вие също трябва да се открие символни връзки, използвайте lstat () с името на файла.

За разлика структура Дирент. върнати от readdir (). структура на стат има доста много задължителен стандарт за полета:

  • st_mode - файловите права (потребител, група, други) и знамена.
  • st_ino - сериен номер на файла.
  • st_dev - устройството, на което се намира файла.
  • st_nlink - аз разчитам на броя на връзки.
  • файлов идентификатор потребителя собственик - st_uid.
  • st_gid - собственик на група.
  • st_size - размер на файла в байтове (за редовни файлове).
  • st_atime - време на последен достъп до файла.
  • st_mtime - време на последна промяна.
  • st_ctime - файл за времето на създаване.

Използване на макро S _ * () за област st_mode. Можете да определите типа на файла:

стат () функция се изпълнява достатъчно бавно, за повечето файлови системи, така че ще съхранява тази информация в паметта, в случай имате нужда от него по-късно.

Някои приложения, като ли и софтуер за архивиране трябва да могат да се покаже информация за самата символна връзка, като например кой файл да сочи към. Подобен резултат може да се постигне с помощта lstat () вместо Stat (); Този метод е полезен в случай, че трябва да се работи с символната връзка, а не файла, за който се посочва.

Споделянето readdir () и стат ()

Над него бе показан как да използвате readdir () и стат () за информация относно съдържанието на директорията. Демонстрирайте програмен код, който илюстрира прилагането на тези функции.

Кодът по-долу, да разглеждате една или повече директории, определени от командния ред и показва някаква информация за всички елементи, които са в директорията, са били открити. Когато той открие друга директория, той го обработва по този начин. Индикатор файлове, посочи от символни връзки и редовни размер файлове. Специални файлове се игнорират.

Както е показано на Обява 2. Това просто приложение пробен използва всички заглавни файлове. На горния етаж е посочено стандартни файлове, които използват всички програми, а последните четири файловете са задължени да използват тази програма readdir () и стат ().

Обявата 2. файлове колекторни

функция process_directory () (който започва своята работа през Обява 3 и завършва в Обява 6) сканира зададената директория и показва някаква информация за всеки елемент от съдържанието. DIR показалка. върнати от opendir (). е идентичен с показалеца на файл (FILE), което връща функция fopen (); това зависи от вида на операционната система обект, който се използва за проследяване на потока директория трябва да се игнорира съдържанието на показалеца DIR.

Обява 3. Преработваща

След отваряне на указаната е необходимо да се предизвика readdir_r () (Обявата 4) за получаване на първия елемент на указателя; всяка следваща readdir_r повикване () връща следващия елемент, докато до края на каталога и entryPtr няма да бъде постигната е настроен на NULL. Можете също така да използвате strncmp (). да се игнорира на елементите. "А". ". Ако не е необходимо, за да пропуснете на обработката на тези елементи, обработката на директорията ще се извършва за неопределено време (например," theDir /./././././././././. ", И така нататък).

Обявата 4. Получаване отделен елемент

Ако елементът е директория, след това рекурсивни process_directory повикване (), а общият брой на откритите позиции за него, за да добавите ново намерен. Ако елементът е име на файла и размера му изход (размер, взет от област st_size структура стат структура).

Обявата 5. транспортна отделен елемент

В края на цикъла се извършват по време на четене и обработка на друг запис от указателя (Обява 6). Ако обработката на запис от указателя е пълна, текущата работна директория е затворен и се връща броя на елементите, които са били обработени.

Обявата 6. четене друг елемент

И накрая, в списъка за 7 се състои от основна функция (), програма, която причинява функция process_directory () за всеки аргумент, съдържаща се в командния ред. В заявлението за бизнес също трябва да бъдат предоставени за изтегляне на съобщение за услуга, в случай че потребителят не посочи поне един аргумент, но аз ще напусне този аспект на читателя като упражнение.

Обява 7. Основната функция

В тази работа е завършен. Въпреки големия брой на прикачени файлове, обработка на записи в указателя, не е много трудно.

заключение