Я пытаюсь перемещать массив символов по символам и копировать его в другой массив символов до тех пор, пока символ чтения не станет \, потому что я хочу создать каталоги адреса, если они не созданы, или получить доступ, если они созданы.
Например:
Adress: dir2/dir3/a
Мой алгоритм:
path = dir2
//if dir2 not created make dir2 and change actual directory to dir2
//if created then access dir2 changing the actual directory to dir2
//empty path with memset and keep storing the adress
path = dir3
//repeat...
Но когда я пытаюсь получить доступ к пути, я получаю последний символ, а не всю строку пути
Выход:
path0: d
path1: i //Should be di
path2: r //Should be dir
path3: 2 //Should be dir2
path: 2 //Should be dir2
Я не знаю, есть ли более эффективный способ сделать это, и я не знаю, как получить полную строку пути, а не последний символ, я вставлял '\ 0' в конце на всякий случай, если это был какой-то проблема с символом конца строки
имя и путь являются переменной типа char[256]
Код:
for (i = 0; i < strlen(name); i++)
{
if (name[i] != '/')
{
path[j] = name[i];
path[i+1] = '\0';
printf("path%d: %s\n", i,path);
}
else
{
path[i] = '\0';
printf("path: %s\n", path);
n = chdir(path);
if (n == ENOENT)
{
n = mkdir(path, 0777);
if (n != 0)
{
fprintf(stderr, "Failed to make the directory to extract: %s\n", strerror(errno));
close(fmypack);
return E_DIR1;
}
chdir(path);
}
else if (n == EACCES)
{
fprintf(stderr, "Failed to access the directory: %s, %s\n", path, strerror(errno));
close(fmypack);
return E_DIR2;
}
else if (n != 0)
{
fprintf(stderr, "Unknow error when try to access the directory: %s, %s\n", path, strerror(errno));
close(fmypack);
return E_DESCO;
}
memset(path, 0, sizeof path);
j=0;
}
printf("path%d: %s\n", i,path);
после каждого символа — это неопределенное поведение без разделителя строки (как это сделано чуть ниже в else
).
@WeatherVane: У него может быть memset()
над петлей for
.
@JonathanLeffler Да, но я делаю это, чтобы контролировать, создан ли каталог уже или нет.
Где и как инициализируются name
, path
и j
? Выложите полный код.
@SGeorgiades имя персонажа[256]; int i, j = 0; путь символа[256];
Также мне кажется, что эту задачу было бы намного проще использовать strtok
j
не увеличивается в коде, который вы показали... вот почему path
всегда только один символ
@SGeorgiades ты прав :(
Если вы сделаете это правильно, вы должны быть в порядке. Вы можете узнать, представляет ли имя файла каталог с stat()
. Вы можете создать строку, содержащую "dir2"
, и создать этот каталог, если он не существует. Затем вы можете расширить эту строку до "dir2/dir3"
и создать этот каталог, если он не существует. Промойте и повторяйте, пока не дойдете до конца пути. См. также Как я могу создать дерево каталогов в C++/Linux? (но этот ответ — код C, который можно вызывать из C++).
В общем, если ваша программа использует chdir()
, вы должны быть осторожны, потому что, если пользователь указывает имена файлов относительно текущего каталога при вызове программы, но вы меняете каталог в другом месте, вам нужно проделать большую работу, чтобы убедиться, что вы по-прежнему имеете доступ правильные файлы. Примечание fchdir()
.
Думаю, я нашел это.
path[i] = '\0';
Но путь создается с использованием j
в качестве индексатора.
path[j] = '\0';
Должно быть правильно.
И вам не хватает приращения на j
:
path[j] = name[i];
path[i+1] = '\0';
Должно быть:
path[j++] = name[i];
path[j+1] = '\0';
Что забавно, на самом деле делать этот компонент по одному с chdir()
на является быстрее, но вероятность того, что вы это нашли, невелика. Когда вы получите пару сотен каталогов в глубину, вы сможете это измерить.
Да, я знал это, но я хотел контролировать, создан ли уже каталог пути или нет, если я могу получить эту информацию простым способом с помощью chdir()
У меня есть еще один вопрос, как я могу получить доступ к ошибкам флага chdir()? Если я проверяю, что n всегда равно -1, если возникает проблема, как я могу проверить, возникает ли ошибка EACCES?
@ДжеймсР: errno
Не делайте
chdir()
—mkdir()
вполне счастливо пойдет по пути, ссылаясь на подкаталог.