C Программирование: Как создать родительский каталог и вставить файлы вручную? - PullRequest
0 голосов
/ 11 февраля 2019

Моя цель состоит в том, чтобы внутри моей C-программы создать новый каталог.В этом каталоге я хочу создать 15 простых текстовых файлов.Часть, на которой я застрял, состоит в том, как сгенерировать 15 текстовых файлов во вновь созданном каталоге.Я создал новый каталог следующим образом:

mkdir("new_dir", 0755);

Но я не уверен, как создать в нем текстовый файл (в той же программе).Любые советы для этого?

1 Ответ

0 голосов
/ 11 февраля 2019

Я предполагаю, что вы находитесь в какой-то системе POSIX.Стандарт C11 (читай n1570 ) не знает о каталогах ( абстракция , предоставляемая вашей операционной системой ).Если вы работаете в Windows, он имеет другой WinAPI (вам следует использовать CreateDirectory )

Во-первых, ваш вызов mkdir (2) может произойти сбой (по ряду причин, в том числе из-за того, что каталог уже существует).И очень вероятно, что вы действительно хотите создать каталог в домашнем каталоге или документ, который вы создаете, в текущем рабочем каталоге (например, оставить бремя некоторой подходящей и предшествующей встроенной оболочки cd вваш пользователь).Практически говоря, путь к каталогу должен быть вычислен во время выполнения в виде строки (возможно, с использованием snprintf (3) или asprintf (3) ).

Так что если вы хотитечтобы создать каталог в домашнем каталоге пользователя (помните, что ~/foo/ раскрывается оболочкой во время глобализации, см. glob (7) ...; вам нужно получитьдомашний каталог из environment (7) ), вы должны написать что-то вроде:

char pathbuf[256];
snprintf(pathbuf, sizeof(pathbuf), "%s/new_dir", getenv("HOME"));

для вычисления этой строки.Конечно, вам нужно обработать ошибку ( getenv (3) или snprintf).Я оставляю эти чеки в качестве упражнения.Возможно, вы захотите сохранить результат getenv("HOME") в некоторой автоматической переменной .

Затем вам нужно будет создать каталог и проверить его на наличие ошибок.По крайней мере (используя perror (3) и см. errno (3) ):

 if (mkdir (pathbuf, 0750)) { perror(pathbuf); exit(EXIT_FAILURE); }

BTW, режим, переданный в mkdir, может неразрешить каждому другому пользователю писать или получать к нему доступ (если это так, у вас может быть некоторая уязвимость ).Поэтому я предпочитаю 0750 вашим 0755.

Наконец вам нужно создать внутри него файлы, возможно, используя fopen (3) перед записью в них.Так что некоторый код, такой как

int i = somenumber();
snprintf(pathbuf, sizeof(pathbuf), 
         "%s/new_dir/file%d.txt", getenv("HOME"), i);
FILE* f = fopen(pathbuf, "w");
if (!f) { perror(pathbuf); exit(EXIT_FAILURE); };

Как мудро прокомментировал Джонатан Леффлер , есть и другие способы.

Я рекомендую документировать некоторые соглашения.Вы хотите, чтобы ваша программа создала каталог в текущем рабочем каталоге или создала его по некоторому «абсолютному» пути, возможно, связанному с домашним каталогом вашего пользователя?Если ваша программа запущена каким-либо пользователем (и не является setuid или не имеет прав доступа root, см. credentials (7) ), ей не разрешено создавать каталоги или файлы произвольномест (см. hier (7) ).

Если вы работаете в Linux, вам лучше прочесть книгу по системному программированию, например ALP или новее.Если вы используете другую ОС, вам следует прочитать документацию по ее системному API.

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