C ++: переименовать все файлы в указанной пользователем директории

Поэтому я хочу иметь возможность автоматически переименовывать все файлы в указанной пользователем директории (я знаю, что c ++ не является оптимальным языком / инструментом для этого).

Например, каталог в настоящее время содержит сотни файлов со случайными именами символов, и я хочу изменить их все на 1 августа, 2 августа, 3 августа и т. Д.

Код

Пользователь указывает каталог, как это

std::string directory;

std::cout << "Enter directory: ";
std::cin >> directory;

Каталог открывается так (используя dirent.h)

DIR *pdir = NULL;
struct dirent *pent = NULL;
const char * DIRECTORY;

// convert directory string to const char
DIRECTORY = directory.c_str();

pdir = opendir (DIRECTORY);

Переименуйте все файлы в указанном каталоге здесь

int i = 1;
std::string s, oldname, newname;
const char * OLDNAME, * NEWNAME;

while (pent = readdir (pdir))
{
// convert int i to str s
std::stringstream out;
out << i;
s = out.str();

oldname = pent->d_name;
newname = "August " + s;

OLDNAME = oldname.c_str();
NEWNAME = newname.c_str();

rename(OLDNAME, NEWNAME);

i++;
}

Все работает до цикла while, который, похоже, абсолютно ничего не делает, — это та часть, на которой я застрял.

Однако странным является то, что этот цикл while, предназначенный для отображения содержимого каталога (используя ту же логику и синтаксис, что и нерабочий цикл), работает идеально.

while (pent = readdir (pdir))
{
std::cout << pent->d_name << "\n";
}

Использование MSVS2012 на Win7.

Еще одна проблема, с которой я столкнусь, заключается в том, что в каталоге разные файлы имеют разные расширения (это можно решить, сохранив последние 4 символа исходного имени и добавив его к новому имени, но не конечно, помощь будет принята с благодарностью).

1

Решение

Проблема в том, что pent->d_name это просто имя файла без связанного пути. Итак, когда вы делаете переименовать, программа будет искать oldname в текущем каталоге, и так как он не существует в этом каталоге, переименовать ничего не делает Чтобы решить эту проблему, вы должны добавить путь к обоим oldname а также newname, например:

oldname = (std::string(DIRECTORY)+pent->d_name).c_str();
newname = (std::string(DIRECTORY)+"August " + s).c_str();
1

Другие решения


По вопросам рекламы [email protected]