Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370

Пробежимся - переименуем папочки. из формата - 1.3.2026 --> в формат - 01.03.2026

25.09.2026, 14:45. Показов 2167. Ответов 49

Студворк — интернет-сервис помощи студентам
Сложно... Всё ли я предусмотрел?
Т/Е Нолики подставить... Convert_out(03.11.2029) ещё вот такие папочки.
Вообще работает. На весь массив запускать боюсь...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//============================================ Функция поиска файлов в дереве каталогов
void EnumerateFileObjects(wchar_t  *Path)
{
    static wchar_t FullPath[Home_fld];
WIN32_FIND_DATAW FindData;
    // ---------------- Выделяем память на стеке, динамически https://learnc.info/c/stack_memory_allocation.html
    wchar_t *Mask = (wchar_t*)_malloca((wcslen(Path) + wcslen(L"\\*") + 1) * 2);
    wcsncpy_s(Mask, wcslen(Path) + wcslen(L"\\*") + 1//< ---- Размер целевого буфера в знаках (дстаточно ли?)
        , Path, wcslen(Path) + 1);//(Единичку не прибавишь, нуль в конце не будет)
    wcscat_s(Mask, wcslen(Mask) + wcslen(L"\\*") + 1//<--- Общий размер буфера в знаках
        , L"\\*");// --- добавим (Ноль она ставит)
    HANDLE  const hFind = FindFirstFileW(Mask, &FindData);
 
    *wcsrchr(Mask, L'\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t) =================
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do {
            if (IsNotDotName(&FindData.cFileName[0]))
            {
        swprintf(FullPath, Home_fld,L"%s%s%s", Mask, L"\\", &FindData.cFileName[0]);
            //=====================================
                 if (IsDirectory(FindData.dwFileAttributes))// <-- нашёл папку ???
                {
                     bool if_enter{false};
        wchar_t *end_of = wcsrchr(FullPath, L'\\')+1;
 
wchar_t new_name[30]{};// Здесь делаем сборку нового имяни папки
 
if (wcschr(end_of, '(') && wcsncmp(end_of + wcslen(end_of) - 5, L"20", 2) == 0)// Это папка именованная числом.
        {
    // Переименовать папки нормальными именами. Нули подставить в даты.
                wchar_t *one = wcschr(end_of, L'.');
 *one = '\0';// Вместо первой с лева точки нультерминатор.....
 
 if (wcslen(wcschr(end_of, '(')) == 2) {// Подставим нолик в первую позицию.
    
     wcsncpy(new_name, end_of, one - end_of - 1);
     wcscat(new_name, L"0");// Это сюда с начала имяни папки до первой скобочки включительно.
     wcscat(new_name, one-1);
     wcscat(new_name, L".");
                if_enter = true;
   }
 else {
 wcscpy(new_name, end_of);
 wcscat(new_name, L".");
 }
*one = '.';
 
wchar_t *two = wcsrchr(end_of, L'.');
 
if (two - one == 2) {// Подставим нолик во вторую позицию.
    wcscat(new_name, L"0");
    wcscat(new_name, two -1);
    if_enter = true;
 }
else {
wcscat(new_name, two - 2);
}
    }
    else {
if (!wcschr(end_of, '(') && wcsncmp(end_of + wcslen(end_of) - 4, L"20", 2) == 0)// Это папка именованная числом.
            {
        wchar_t *one = wcschr(end_of, L'.');
        *one = '\0';
                if (wcslen(end_of) == 1) {// Подставим нолик в первую позицию.
                    wcscpy(new_name, L"0");
                    wcscat(new_name, end_of);
    if_enter = true;
                }
                else wcscpy(new_name, end_of);
        *one = '.';
                wchar_t *two = wcsrchr(end_of, L'.');
 
                if (two - one == 2) {// Подставим нолик во вторую позицию.
                    wcscat(new_name, L".0");
                    wcscat(new_name, two - 1);
    if_enter = true;
                }
                else {
                    wcscat(new_name, L".");
                    wcscat(new_name, two - 2);
                }
            }
        }
    
     if (if_enter) {// Если было что то изменено, переименование и вызов рекурсии с новым имянем.
 
            wchar_t new_full_Path[Home_fld]{};// Делаем полное имя с путём вместе.
            wcscpy(new_full_Path, FullPath);
            *(wcsrchr(new_full_Path, L'\\') + 1) = '\0';// Отрежем старое название добавим новое.
            wcscat(new_full_Path, new_name);
 
            if (_wrename(FullPath, new_full_Path) == 0)
                std::cout << "Folder renamed successfully!\n";
_freea(Mask);
            EnumerateFileObjects(new_full_Path);
}
else {
_freea(Mask);// По моему перед рекурсивным вызовом самой себя там создастся ещё массив. (ИИ не согласен)
            EnumerateFileObjects(FullPath);
    printf("------- not required -------\n"); }
                }
            }
        } while (NULL != FindNextFileW(hFind, &FindData));
                             _freea(Mask);
        FindClose(hFind);
    }
}
 
 
 
void SelectFolder(WCHAR *path) {
    // Инициализация COM
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
 
    BROWSEINFO bi = { 0 };
    bi.lpszTitle = L"Выберем папку для просмотра";
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; // Современный вид с возможностью создания папки
 
    PIDLIST_ABSOLUTE pidl = SHBrowseForFolder(&bi);
    if (pidl != NULL) {
 
        if (SHGetPathFromIDList(pidl, path)) {
        }
        // Освобождение памяти, выделенной оболочкой
        CoTaskMemFree(pidl);
    }
    CoUninitialize();
}
 
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{// <<--- Убираем консоль
// HWND Hide; AllocConsole(); Hide = FindWindowA("ConsoleWindowClass", NULL); ShowWindow(Hide,0);
    
    wchar_t target_path[Home_fld]{};
    SelectFolder(target_path);
 
    EnumerateFileObjects(target_path);
    printf("========== END ======== \n");
    getchar();
 
        return 0;
    }
Почистил я поиск.
swprintf(FullPath, Home_fld,L"%s%s%s", Mask, L"", &FindData.cFileName[0]);
В строке 20 вот такую фигню влепил.

Пара функций ещё, но они это.. Дефолтная фигня...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//-------------------------
bool IsNotDotName(std::wstring const & Filename)
{
    return ((Filename != L".") && (Filename != L".."));
}
 
//----------------------
bool IsDirectory(DWORD FileAttrs)
{
    return (
        (0 != (FileAttrs & FILE_ATTRIBUTE_DIRECTORY)) &&
        (0 == (FileAttrs & FILE_ATTRIBUTE_REPARSE_POINT))
        );
}
Добавлено через 19 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
Дефолтная фигня...
Знаю людей, которые бы зелёных макросов навинтили, а я в макросах не особо разбираюсь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2026, 14:45
Ответы с готовыми решениями:

Visual Studio 2026 (обсуждение)
Предлагаю обсудить Visual Studio 2026. - Новая версия устанавливается в C:\Program...

VS 2026, CMake проект. Не устанавливается текущая директория
Привет всем! Хочу выполнять отладку с текущей (рабочей) директорией E:\work\CPP\genfw24. Там...

Проблема с подразделом "вызовы к" Иерархии вызовов в vs 2026
Доброго вечера всем! Появилась проблемка, у меня есть конструктор копирования, который вызывается в...

49
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
26.09.2026, 01:00  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Наталья8 Посмотреть сообщение
В смысле... Я напишу... Твоя - моя всё равно не поймёт.
Вот по этому я туда и не лезу, а пишу на более понятном языке.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
26.09.2026, 01:05  [ТС]

Ты на чём пилил то? У меня такое не принимает.
По одёжке протягивай ножки.
0
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 34
26.09.2026, 01:05
Цитата Сообщение от Наталья8 Посмотреть сообщение
Вот по этому я туда и не лезу, а пишу на более понятном языке.
Хозяин-барин, никто не спорит. Если Вам так нравится, Ваше право.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
26.09.2026, 01:07  [ТС]
Эта хрень, с винды на линуху всё равно не пойдёт.
И наоборот.
0
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 34
26.09.2026, 01:08
Цитата Сообщение от Наталья8 Посмотреть сообщение
Ты на чём пилил то? У меня такое не принимает.
Да как обычно, VsCode, компилятор g++ (x86_64-posix-seh-rev2, Built by MinGW-W64 project) 12.2.0, откуда-то скачанный и распакованный в папку (и прописанный в PATH).

Добавлено через 1 минуту
Цитата Сообщение от Наталья8 Посмотреть сообщение
Эта хрень, с винды на линуху всё равно не пойдёт.
И наоборот.
Смотря какая. Та что выше на std::regex и std::filesystem пойдет везде, в том и смысл ее.
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
26.09.2026, 04:12  [ТС]
Я могу напрячься и сделать под своё visual studio 2019.
Только у тебя оно работать не будет. По тому и пишу что неоднозначно.

Добавлено через 1 минуту
Цитата Сообщение от SarJohnDoe Посмотреть сообщение
пойдет везде
Пойдёт, только переделывать надо.
C++ 17 надо было включить. Вроде всё нормально.
Только компилировать я это гавно, можно не буду, а то он мне на переименует...

Добавлено через 10 минут
Для Visual Studio 2017 и 2019 на Windows ключевым изменением является обязательное использование std::wstring и юникода (wchar_t). В Windows пути к файлам хранятся в кодировке UTF-16, и если использовать обычный std::string для папок с кириллицей или пробелами, программа либо пропустит их, либо упадет с ошибкой.Также в регулярных выражениях мы переходим на std::wregex и std::wsmatch, а пути выводим через std::wcout (предварительно настроив локаль, чтобы консоль VS корректно отображала русские буквы).

Добавлено через 2 часа 1 минуту
Дискуссия. Почему то в разделе си. Не пиши на си, пиши хер на чём.
Извиняюсь, на си много кода написал. На указанном выше не писал.
Зачем мне извращаться?
Тем более папки переименовывать надо понимать как оно работает,
что бы не наворотить чего то неисправимого.

Добавлено через 25 минут
SarJohnDoe,
А про редекс и файлесистем, тебе искуственный интелект сказал.
Мне тоже говорил. И занимаешься ты троллингом.
0
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 34
26.09.2026, 06:36
Цитата Сообщение от Наталья8 Посмотреть сообщение
А про редекс и файлесистем, тебе искуственный интелект сказал.
Мне тоже говорил. И занимаешься ты троллингом.
Вам - вполне возможно, мне точно нет, поскольку это первое что приходит в голову при мысли, что из стандартной библиотеки можно использовать для Вашей задачи.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
26.09.2026, 15:02  [ТС]
https://vk.ru/@programming_assistance-filesystem
Спасибо, я почитал. Только это не си, а плюсы.
Я конечно воспользуюсь плюсами, если напрягает.
Типа генератор RND...
Я же не стану его писать.
Типа вихрь какого то Мерсенне.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
27.09.2026, 15:58  [ТС]
На си писал волшебные вещи... Сам удивляюсь.
А redex я не пользовался никогда. Собирал строки на сишных функциях.
Может он кому то очень нужен, а мне вот так чтобы впритык...
Что то такого не было. Не потребовался.
Почитал filesystem.
То же самое... Слова другие. Вообще оперировать путями с помощью знаков "=", "==", +,-.
Как то не привыкши я. Я вообще стринги не очень люблю...

Добавлено через 8 минут
C++
1
2
3
4
5
6
wchar_t *end_of = wcsrchr(FullPath, L'\\')+1;
 Указатель на начало имени файла.
if (wcschr(end_of, '(') && wcsncmp(end_of + wcslen(end_of) - 5, L"20", 2) == 0);
 //   Если в имени файла есть скобочка и цифра 20 на положенном месте.
 if (!wcschr(end_of, '(') && wcsncmp(end_of + wcslen(end_of) - 4, L"20", 2) == 0);
 //  Или в нём нет скобочки но цифра 20 там где надо.
0
 Аватар для volodin661
7153 / 2341 / 353
Регистрация: 10.12.2013
Сообщений: 8,120
27.09.2026, 16:55
Цитата Сообщение от Наталья8 Посмотреть сообщение
Тем более папки переименовывать надо понимать как оно работает,
что бы не наворотить чего то неисправимого.
Когда я был маленький и реализовывал программно файловые манипуляции,
то в той же точке, где происходил 'rename/move', сразу генерил undo-строку с обратным переименованием и направлял её в undo-file, чтобы, ежли чо,
вернуть всё взад.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,792
06.10.2026, 21:29
Цитата Сообщение от SarJohnDoe Посмотреть сообщение
static std::regex re (R"(^([0-9]{1}).([0-9]{1}).([0-9]{4})$)");
В регулярках точка означает любой символ. А это означает, что всякие
1-1-2026
1/1/2026
1X1Y2026
1 1 2026 и т.д.
тоже будут переименованы в 01.01.2026

Точку нужно было экранировать \., чтобы она воспринималась как точка, а не как любой символ.

Цитата Сообщение от Наталья8 Посмотреть сообщение
Только компилировать я это гавно, можно не буду, а то он мне на переименует...
Человек потратил своё время, написал код, а ты даже не проверив его сразу называешь г***ом. Ничего страшного с твоим компьютером не случится.
Программа всего лишь переименовывает папки, содержащиеся в C:\root. Даже если ты случайно забудешь поменять этот путь на нужный, то при запуске скорее всего ничего и не произойдет, ибо если такой папки не будет (а именно так наверное и будет), то main возвратит 1 и завершится.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
07.10.2026, 01:02  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Человек потратил своё время
Я спросил у искусственного интеллекта.
А как это?
Он мне такую же хрень выкинул за несколько секунд.
Ни кто здесь не тратил ни какого времени.
И код такой, ни какой ценности не несёт.

Добавлено через 9 минут

Не по теме:

Был такой Байтик с таксой на аватарке.
Что то нету его больше.
Вот он так же посылал коды как ИИ.
Оно не рабочее, но что то кому то должно напоминать.
Как схема..

0
07.10.2026, 01:03

Не по теме:

Наталья8, ну ок.

Если шаришь в ИИ, можешь в конкурсе вайб-кодеров участвовать: https://gamedev.ru/projects/forum/?id=297342
ИИ неплохо пишет на HTML/CSS/JS. Организатор конкурса разрешил использовать нейросети.
Призовой фонд не большой (3к рублей), но всё же полезный опыт будет.
Из нашего форума там XLAT участвует.

0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
07.10.2026, 01:29  [ТС]
---------------------------------
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,244
Записей в блоге: 3
Вчера, 10:51
Цитата Сообщение от Наталья8 Посмотреть сообщение
переименуем папочки
без запарок - 1 минута делов:

тест на винде-11 64 (исходник лёгок к кросс)
Вложения
Тип файла: rar Переименование папок.rar (599.9 Кб, 12 просмотров)
1
 Аватар для volodin661
7153 / 2341 / 353
Регистрация: 10.12.2013
Сообщений: 8,120
Вчера, 14:28
безотносительно прекрасного на 500 строк непереносимого* на другие ОС кода от XLAT, возник вопрос к Наталья8: а зачем вообще понадобилось переименовывать?
Если вопрос в визуальной сортировке при просмотре файловым менеджером, то достаточно привести в соответствие с именем какой-нибудь временной атрибут(create,modify,access) у данной директории.





*
Цитата Сообщение от XLAT Посмотреть сообщение
(исходник лёгок к кросс)
и? почему тогда не сделан кросс ?
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
Вчера, 14:43  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
зачем вообще понадобилось переименовывать?
Искусственный интеллект мне написал, что так как есть, ни есть хорошо.
И мой смотрелка на этих же функциях (не идеально конечно, но лучше перебирает.)
На винде такой стандарт, а не эдакий.

Добавлено через 8 минут
XLAT,
Знаю я ваше творчество.
Опять же, моё я могу разобрать на запчасти. Вот функцию перебора файлов упорядочил.
А с++ без нужды не люблю...
Ну бывает что то понадобиться. Нельзя на си обойти. Тогда да.
Основное логика. А язык - какой знаешь хорошо.
Что бы до конца понимать происходящее.
Понимание - основное...
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
Вчера, 14:54  [ТС]
Название: NewPicture9.png
Просмотров: 34

Размер: 8.0 Кб
Тестировал, переименовывает.
Там внутри папки...
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
Вчера, 15:01  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
1 минута делов

Не по теме:

Кстати, что то серьёзное делать надо доооолго, несколько дней.
Периодически обращаясь к содеянному.
Тогда поймёшь всё до конца и всё будет правильно.
Бывает так - ну не видишь ты... Не видишь и всё... Перед тобою оно лежит и не видишь.
На следующий день проснёшься и увидишь.
Я слесарю иногда. (слово слесарь.)
Вот что бы сделать правильно, надо хорошо подумать.
А то будешь делать одно и то же несколько раз.

0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,792
Вчера, 15:22
Цитата Сообщение от volodin661 Посмотреть сообщение
почему тогда не сделан кросс ?
ну с минимальными правками код XLAT соберётся и будет работать одинаково на Windows, Linux и macOS.

например, вижу, что лучше написать

C++
1
2
3
#ifdef _WIN32
        std::system("chcp 65001 > nul");
#endif
а вот это вроде ненадежно на Linux и macOS
C++
1
fs::weakly_canonical(fs::path(argv0), ec)
еще, кое-какие хидеры отсутствуют

Но в целом норм, не вижу причин, чтобы придираться к этому коду. Он же написан на платформонезависимом С++.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
Вчера, 15:22

Сборка QT6 из исходников в 2026 году
Добрый вечер! Ввиду проблем с онлайн-инсталлятором (блокировка доступа из РФ) QT6 хочу попробовать...

Напишите программу, которая бы читала дерево в формате (а) и затем печатала бы это дерево в формате (б).
Представление дерева: а) Д (Б (А, Ф (В,)), Е (,З (Ж, И))) б) Д Б ...

Формат файлов
Здравствуйте. Есть достаточно большое число файлов doc,xls и txt в одной папке, но все имена...

Форматирование текста
Подскажите пожалуйста как можно отформатировать текст перед выводом его на экран.

Форматный вывод с помощью cout
У меня простой вопрос. В си есть такая функция printf. Что-бы вывести дробное число k без всяких...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru