Поэтому я хочу иметь возможность автоматически переименовывать все файлы в указанной пользователем директории (я знаю, что 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 символа исходного имени и добавив его к новому имени, но не конечно, помощь будет принята с благодарностью).
Проблема в том, что pent->d_name
это просто имя файла без связанного пути. Итак, когда вы делаете переименовать, программа будет искать oldname
в текущем каталоге, и так как он не существует в этом каталоге, переименовать ничего не делает Чтобы решить эту проблему, вы должны добавить путь к обоим oldname
а также newname
, например:
oldname = (std::string(DIRECTORY)+pent->d_name).c_str();
newname = (std::string(DIRECTORY)+"August " + s).c_str();