В C, как я могу создать файл из filepath, даже если каталоги не существуют? - PullRequest
1 голос
/ 22 октября 2010

Я беру путь к файлу от пользователя.Мне нужно получить доступ к этому файлу и создать его, если он не существует.Мне также нужно создать промежуточные каталоги, если они еще не существуют.

Например, если мой каталог выглядит так:

mydir
|
+---subdir
|   |
|   +-- FileA
|
+---File1

Я мог бы получить mydir / subdir / FileA ибудет затем получить доступ к соответствующему файлу.Однако я также могу получить mydir / NewDir / FileB.

Как я могу сделать это с помощью системных вызовов Unix в C?Я пытался использовать open () с флагами (O_RDWR | O_CREAT), но это не сработало.

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Я думаю, что этот ответ охватывает ваш вопрос:

Рекурсивный системный вызов mkdir () в Unix

Короче говоря, вы должны сами создать подкаталоги.

2 голосов
/ 22 октября 2010

Если вам разрешено его использовать, вызовы ОС могут быть заключены в вызов system().например, для вывода списка файлов system( "ls" );

Чтобы создать каталог, включающий промежуточные, используйте mkdir с -p

mkdir -p mydir/NewDir/

(AFAIK, если NewDir уже не повредит,существовал.)

Чтобы создать пустой файл, используйте touch

touch mydir/NewDir/FileB

Follow : я написал эту быструю программу проверки концепции ипроверено в cygwin.

#include <stdlib.h>
#include <string.h>

int main() {

    char const * dir = "dir/subdir";
    char const * file = "file";

    char mkdirCmd[ 80 ] = { 0 };
    strcat( mkdirCmd, "mkdir -p " );
    strcat( mkdirCmd, dir );

    char touchCmd[ 80 ] = { 0 };
    strcat( touchCmd, "touch " );
    strcat( touchCmd, dir );
    strcat( touchCmd, "/" );
    strcat( touchCmd, file );

    system( mkdirCmd );
    system( touchCmd );

    return 0;
}

Юнит-тест:

$ ls
mkdir.c  mkdir.exe*

$ ./mkdir.exe 

$ ls
dir/  mkdir.c  mkdir.exe*

$ ls -R dir
dir:
subdir/

dir/subdir:
file
0 голосов
/ 22 октября 2010

К сожалению, нет рекурсивного македира, поэтому я боюсь, что вам, возможно, придется сделать это самостоятельно.

Но я думаю, это будет легко сделать

функция recursiveCreate (filepath) разделить путь к файлу косой чертой если последняя часть создаст файл еще создать каталог конец

Теперь у вас есть функция :), используя ее, вы станете счастливее, чем какая-то определенная в UNIX функция :)

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