10.10. Создание каталога
10.10. Создание каталога
Проблема
Требуется создать каталог, причем эта операция должна быть переносимой, т.е. в ней не должен использоваться специфичный для конкретной ОС программный интерфейс.
Решение
На большинстве платформ вы сможете использовать системный вызов mkdir, который входит в состав большинства компиляторов и содержится в заголовочных файлах C-функций. Он имеет разный вид в различных ОС, но тем не менее вы можете его использовать для создания нового каталога. Стандартными средствами C++ нельзя обеспечить переносимый способ создания каталога. В этом вы можете убедиться на примере 10.15.
Пример 10.15. Создание каталога
#include <iostream>
#include <direct.h>
int main(int argc, char** argv) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " [new dir name] ";
return(EXIT_FAILURE);
}
if (mkdir(argv[1]) == -1) { // Созвать каталог
std::cerr << "Error: " << strerror(errno);
return(EXIT_FAILURE);
}
}
Обсуждение
Системные вызовы по созданию каталогов слегка отличаются в различных ОС, но пусть это вас не останавливает — их все же следует использовать. В большинстве систем поддерживаются различные варианты вызова mkdir, поэтому для создания каталога достаточно просто знать, какой включать заголовочный файл и как выглядит сигнатура функции.
Пример 10.15 работает в системах Windows, но не в Unix. В Windows mkdir объявляется в <direct.h>. Эта функция принимает один параметр (имя каталога) и возвращает -1, если возникла ошибка, устанавливая в errno соответствующий номер ошибки. Вы можете получить зависящую от реализации текстовую строку ошибки, вызывая strerror или perror.
В Unix mkdir объявляется в <sys/stat.h>, и сигнатура этой функции немного отличается. Семантика ошибки такая же, как в Windows, но существует второй параметр, определяющий права доступа нового каталога. Вы должны указать права доступа, используя традиционный формат chmod (см. дополнительную информацию на man-странице chmod); например, 0777 означает, что владелец, групповой пользователь и прочие пользователи имеют право на чтение, запись и выполнение. Таким образом, вы могли бы вызвать эту функцию следующим образом.
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char** argv) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " [new dir name] ";
return(EXIT_FAILURE);
}
if (mkdir(argv[1], 0777) == -1) { // Создать каталог
std::cerr << "Error: << strerror(errno);
return(EXIT_FAILURE);
}
}
Если вам требуется обеспечить переносимость, не следует самому писать операторы #ifdef, лучше воспользоваться библиотекой Boost Filesystem. Вы можете создать каталог, используя функцию сreate_directory, как показано в примере 10.16, который содержит короткую программу, создающую каталог.
Пример 10.16. Создание каталога средствами Boost
#include <iostream>
#include <string>
#include <cstdlib>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace std;
using namespace boost::filesystem;
int main(int argc, char** argv) {
// Проверка параметров...
try {
path p = complete(path(argv[1], native));
create_directory(p);
} catch (exception& e) {
cerr << e.what() << endl;
}
return(EXIT_SUCCESS);
}
Функция create_directory создает каталог, имя которого вы задаете в аргументе path. Если этот каталог уже существует, выбрасывается исключение filesystem_error (которое является производным от стандартного класса исключения). Пояснения по классу path и функции complete (оба они входят в библиотеку Boost Filesystem) приводятся в обсуждении рецепта 10.7. См. рецепт 10.11, где показан пример удаления каталога и всех содержащихся в нем файлов. С другой стороны, если переносимость вас не волнует, используйте программный интерфейс файловой системы вашей ОС, который, вероятно, обладает большей гибкостью.
Смотри также
Рецепт 10.12.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
5.1. Просмотр содержимого каталога
5.1. Просмотр содержимого каталога Все Unix-системы, включая Linux, используют для хранения файловой информации на диске один и тот же концептуальный дизайн. Хотя в реализации дизайна есть значительные вариации, интерфейс на уровне С остается постоянным, давая возможность
14.1.3. Смена текущего каталога
14.1.3. Смена текущего каталога Предусмотрено два системных вызова, меняющих текущий каталог процесса: chdir() и fchdir().#include <unistd.h>int chdir(const char * pathname);int fchdir(int fd);Первый системный вызов получает имя каталога в качестве единственного аргумента; второй принимает файловый
14.2. Смена корневого каталога
14.2. Смена корневого каталога Хотя в системе имеется один корневой каталог, значение / может меняться для каждого процесса в системе. Это обычно делается для предотвращения доступа к файловой системе со стороны сомнительных процессов (например, демоны ftp, обрабатывающие
16.19.1 Модель каталога
16.19.1 Модель каталога Информационная база каталога (Directory Information Base) распределена среди группы баз данных, управляемых агентами обслуживания каталогов (Directory Service Agent — DSA). Пользователи обращаются к каталогам через пользовательский агент каталога (Directory User Agent — DUA). DUA
1.4.6. Специальная пиктограмма для каталога
1.4.6. Специальная пиктограмма для каталога Щелкните правой кнопкой мыши на каталоге, выберите в контекстном команду Свойства и в открывшемся окне свойств перейдите во вкладку Эмблема (рис. 1.57). Здесь вы можете выбрать любой значок для нашего каталога. Выбранный вами значок
1.7.3. Структура каталога
1.7.3. Структура каталога На сегодня в каталоге Яндекса 15 разделов первого уровня (рис. 1.16). Помимо привычных, встречающихся и в иных каталогах разделов — Отдых, Бизнес, Культура и иных, в этом каталоге есть уникальный раздел. Он предназначен для детей и называется "Интернет
Меню каталога
Меню каталога Меню каталога обязательно должно быть вертикальным! В ходе многочисленных тестов выяснилось, что горизонтальное меню менее эффективно и вызывает у людей больше трудностей. Кроме того, практика показывает, что подавляющее большинство людей интуитивно ищут
Страница каталога
Страница каталога На самой странице каталога пользователь обязательно должен видеть товары – конкретные предложения о покупке. Чаще всего владельцы интернет-магазинов спрашивают, сколько товаров нужно показывать на странице каталога.Однозначного ответа нет. Это
10.1.30. Обход каталога
10.1.30. Обход каталога Метод класса foreach — это итератор, который последовательно передает в блок каждый элемент каталога. Точно так же ведет себя метод экземпляра each.Dir.foreach("/tmp") { |entry| puts entry }dir = Dir.new("/tmp")dir.each { |entry| puts entry }Оба фрагмента печатают одно и то же (имена всех файлов и
10.1.31. Получение содержимого каталога
10.1.31. Получение содержимого каталога Метод класса Dir.entries возвращает массив, содержащий все элементы указанного каталога:list = Dir.entries("/tmp") # %w[. .. alpha.txt beta.doc]Как видите, включаются и элементы, соответствующие текущему и родительскому каталогу. Если они вам не нужны, придется
10.11. Удаление каталога
10.11. Удаление каталога ПроблемаТребуется удалить каталог, причем эта операция должна быть переносимой, т.е. в ней не должен использоваться специфичный для конкретной ОС программный интерфейс.РешениеНа большинстве платформ вы сможете воспользоваться системным вызовом