Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/123: Рейтинг темы: голосов - 123, средняя оценка - 4.85
5 / 5 / 0
Регистрация: 31.03.2010
Сообщений: 71

Поиск папок с помощью FindFirstFile\FindNextFile

24.08.2010, 09:12. Показов 27289. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как найти только папки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2010, 09:12
Ответы с готовыми решениями:

FindFirstFile и FindNextFile рекурсивный поиск файла
Как безопасно (без всевозможных переполнений и высвобождением ресурсов) реализовать рекурсивный поиск файла на одном из разделов диска? Или...

FindFirstFile, FindNextFile и setLocale
Пытался пройти по файлам в каталоге, как в примере на MSDN. Написал такой код #include <windows.h> #include <iostream> ...

FindNextFile,FindFirstFile,FindClose
#include <windows.h> #include <iostream> #include<tchar.h> using namespace std; //strcpy, strcat //_tcscpy,_tcscat int...

51
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2014, 16:32
Студворк — интернет-сервис помощи студентам
Добавьте в функцию Dir (рядом с объявлением DirList) такой фрагмент:
C++
1
2
size_t const StackVarSize =
    sizeof (buf) + sizeof (buff) + sizeof (DirList);
И посмотрите, чему равен StackVarSize - это количество байт,
которое съедается на каждом шаге рекурсии.

Размер стека по умолчанию равен одному мегабайту.
Разделив 1 мегабайт на полученное число, получите
ограничение на количество вложенности.

Поиск по файловой системе лучше делать нерекурсивным,
тогда не будет ограничений, связанных с рекурсией.

Добавлено через 55 секунд
Цитата Сообщение от qwertun Посмотреть сообщение
да собственно там только одна переменная - путь к папке, уменьшение её размера не к чему хорошему не приведёт, т.к. путь может быть достаточно длинным.
Хотя бы замените свои массивы каким-нибудь std::wstring.
Даже это приведет к ощутимому выигрышу в глубине
возможной рекурсии.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 16:34
Цитата Сообщение от Убежденный Посмотреть сообщение
Поиск по файловой системе лучше делать нерекурсивным,
тогда не будет ограничений, связанных с рекурсией.
А как тогда "ходить" по папкам?
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 16:39
Убежденный, сделал так
C
1
2
3
4
5
6
7
8
9
10
11
12
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
    i++;
    dir++;
    wcscat(buff, root);
    wcscat(buff, SL);
    wcscat(buff, FindFileData.cFileName);
    size_t const StackVarSize = sizeof (buf) + sizeof (buff) + sizeof (DirList);
    printf("%d\n", StackVarSize);
    Dir(buff);
    memset(buff, 0, sizeof(buff));
}
Вывод на скрине
Миниатюры
Поиск папок с помощью FindFirstFile\FindNextFile  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2014, 17:14
Ну вот, 130 килобайт стековых переменных тратится на каждую итерацию.
1 мегабайт резерва / 130 кило - это получается примерно 7 итераций.
Значит, поиск обломится на папке с такой глубиной вложенности.
Можете сами проверить и убедиться.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 17:16
Убежденный, Вы говорили что это можно сделать без рекурсии. Как?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2014, 17:20
Ваш код в плане использования ресурсов стека эквивалентен такому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Dir()
{
    volatile WIN32_FIND_DATAW wfd;
    volatile wchar_t buf[MAX_PATH];
    volatile wchar_t buff[MAX_PATH];
    volatile wchar_t DirList[MAX_PATH][MAX_PATH];
 
    static int Counter = 0;
    std::cout << Counter++ << std::endl;
 
    Dir();
}
У меня вылетает с переполнением стека на цифре 6.

Цитата Сообщение от qwertun Посмотреть сообщение
Вы говорили что это можно сделать без рекурсии. Как?
Например, так.
Берем исходную папку, находим в ней все файловые объекты.
Каждую найденную папку добавляем в список.
Сам список держим в виде файла на диске, что позволяет
ему быть практически неограниченного размера.
Когда перечисление заканчивается, смотрим, была ли добавлена
хотя бы одна папка в список. Если есть - выполняем также проход
по ней. И так далее, пока на очередном витке не окажется, что
ничего нового в список не добавлено. В этом случае поиск завершен.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 17:24
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, так.
Берем исходную папку, находим в ней все файловые объекты.
Каждую найденную папку добавляем в список.
Сам список держим в виде файла на диске, что позволяет
ему быть практически неограниченного размера.
Когда перечисление заканчивается, смотрим, была ли добавлена
хотя бы одна папка в список. Если есть - выполняем также проход
по ней. И так далее, пока на очередном витке не окажется, что
ничего нового в список не добавлено. Значит, поиск завершен.
Это получается что для каждой папки нужно создавать отдельный файл, иначе как можно будет перейти от одной папки к другой в одной и той же?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2014, 17:47
Цитата Сообщение от qwertun Посмотреть сообщение
Это получается что для каждой папки нужно создавать отдельный файл
Нет, файл один. В него добавляются имена всех найденных папок.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 18:59
Цитата Сообщение от Убежденный Посмотреть сообщение
Нет, файл один. В него добавляются имена всех найденных папок.
Хорошо. Допустип имеем мы в папке test несколько папок А, В и С, а в них еще папки. Заносим в наш файл имена папок А, В и С, потом заходи в папку А заносим туда названия папок из папки А. Как потом программа "будет знать" что нужно еще перейти в папку В если её названия уже не будет в файле?

Добавлено через 1 минуту
Конечно есть вариант не перезаписывать файл, а всё подряд туда писать, но если так, то в нём будет полнейший балаган в котором невозможно будет ничего найти.

Добавлено через 1 час 7 минут
Я ДНО!!!!!!!!!
Массив DirList там нафиг не нужен! Он просто остался с прошлого варианта попытки посчитать количество папок и файлов! Я его снёс и всё норм! 138 гиг занятого места 100k+ фалов и почти косарь папок посчитало и збс)))
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.03.2014, 19:02
qwertun, ну и что же идеал достигнут? Код в студию =)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.03.2014, 19:04
Цитата Сообщение от qwertun Посмотреть сообщение
Допустип имеем мы в папке test несколько папок А, В и С, а в них еще папки. Заносим в наш файл имена папок А, В и С, потом заходи в папку А заносим туда названия папок из папки А. Как потом программа "будет знать" что нужно еще перейти в папку В если её названия уже не будет в файле?
Заносим в файл - т.е. добавляем имя папки в конец файла.
Все, что в него уже записано ранее, остается на месте.

Цитата Сообщение от qwertun Посмотреть сообщение
Конечно есть вариант не перезаписывать файл, а всё подряд туда писать, но если так, то в нём будет полнейший балаган в котором невозможно будет ничего найти.
Последовательная запись в конец файла != балаган.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 19:04
Izual, Это конечно не окончательный вариант (оконное приложение с листвью и прочим), а только консольное приложение, но оно работает)))
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
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void Dir(wchar_t root[]);
int GDir = 0, GFile = 0;
int main()
{
    setlocale(LC_ALL, "rus");
    printf("Подождите...\nИдёт подсчёт кол-ва папок и файлов...\nЭто может занять некоторое время...");
    Dir(L"D:");
    printf("%d\n", GFile);
    printf("%d\n", GDir);
    system("pause");
}
int SizeArr(wchar_t arr[])
{
    int i = 0;
    while (arr[i] != NULL)
        i++;
    return i;
}
void Dir(wchar_t root[])
{
    wchar_t SL[] = L"\\";
    wchar_t ForFind[] = L"*.*";
    wchar_t *buf = new wchar_t[SizeArr(root) + SizeArr(SL) + SizeArr(ForFind)];
    buf[0] = L'\0';
    wcscat(buf, root);
    wcscat(buf, SL);
    wcscat(buf, ForFind);
    WIN32_FIND_DATA FindFileData;
    int dir = 0, file = 0;
    HANDLE hFind = FindFirstFile(buf, &FindFileData);
    if(hFind != INVALID_HANDLE_VALUE)
    {
        int i = 0;
        do
        {
            if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
            if (lstrcmp(FindFileData.cFileName, L".") != 0)
            if (lstrcmp(FindFileData.cFileName, L"..") != 0)
            {
                if (hFind == INVALID_HANDLE_VALUE)
                {
                }
                else
                {
                    if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                    {
                        i++;
                        dir++;
                        wchar_t *buff = new wchar_t[SizeArr(root) + SizeArr(SL) + SizeArr(FindFileData.cFileName)];
                        buff[0] = L'\0';
                        wcscat(buff, root);
                        wcscat(buff, SL);
                        wcscat(buff, FindFileData.cFileName);
                        Dir(buff);
                        memset(buff, 0, sizeof(buff));
                    }
                    else
                    {
                        file++;
                    }
                }
            }
        }
        while(FindNextFile(hFind, &FindFileData));
        GFile += file;
        GDir += dir;
        FindClose(hFind);
    }
}
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.03.2014, 19:13
qwertun, это и требовалось, сам алгоритм, а окошки сделают сами те кто нуждаются. Спасибо =)
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
22.03.2014, 19:14
Цитата Сообщение от Izual Посмотреть сообщение
а окошки сделают сами те кто нуждаются.
да собственно я и нуждаюсь))))
Осталось только копипастом в другой проект перенести
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
14.04.2014, 10:17
Ребята! Если тут есть кто живой откликнетесь пожалуйста!
Я столкнулся с небольшой проблемой при прикручивании кода выше в оконное приложение.
В функции которая считает кол-во файлов и папок есть рекурсия из-за этого все переменные с путями я решил сделать вида
C
1
wchar_t *buf = new wchar_t[какоето число];
что-бы уменьшить и размер и снизить вероятность переполнения стека, но возникла проблема, бывает прога проходит эту строку и всё хорошо, а бывает выскакивает необработанное исключение (см. скрин)
Миниатюры
Поиск папок с помощью FindFirstFile\FindNextFile  
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
14.04.2014, 10:22
Забыл кинуть код Бывает
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
void FileCountDirSize(HWND hStaticTmp, wchar_t szBuf[], int check)
    {
        wchar_t SL[] = L"\\";
        wchar_t ForFind[] = L"*.*";
        wchar_t *buf = new wchar_t[SizeArr(szBuf) + SizeArr(SL) + SizeArr(ForFind)];
        //wchar_t buf[MAX_PATH] = { 0 };
        buf[0] = L'\0';
 
        if (check == 0)
        {
            GetWindowText(hStaticTmp, buf, MAX_PATH);
            wcscat(buf, szBuf);
            memset(szBuf, 0, sizeof(szBuf));
            wcscat(szBuf, buf);
            check = 1;
        }
        else
        {
            wcscat(buf, szBuf);
        }
 
        wcscat(buf, SL);
        wcscat(buf, ForFind);
 
        WIN32_FIND_DATA FindFileDataF;
 
        int dir = 0, file = 0;
        HANDLE hFindF = FindFirstFile(buf, &FindFileDataF);
        if(hFindF != INVALID_HANDLE_VALUE)
        {
            int i = 0;
 
            do
            {
                if (!(FindFileDataF.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
                if (lstrcmp(FindFileDataF.cFileName, L".") != 0)
                if (lstrcmp(FindFileDataF.cFileName, L"..") != 0)
                {
                    if (hFindF == INVALID_HANDLE_VALUE)
                    {
                        //MessageBox(0, L"Ошибка", L"Ненаиден", MB_OK | MB_ICONWARNING);
                    }
                    else
                    {
                        if (FindFileDataF.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                        {
                            i++;
                            dir++;
                            wchar_t *buff = new wchar_t[SizeArr(szBuf) + SizeArr(SL) + SizeArr(FindFileDataF.cFileName)];
                            //wchar_t buff[MAX_PATH] = { 0 };
                            buff[0] = L'\0';
                            wcscat(buff, szBuf);
                            wcscat(buff, SL);
                            wcscat(buff, FindFileDataF.cFileName);
 
                            FileCountDirSize(hStaticTmp, buff, 1);
 
                            memset(buff, 0, sizeof(buff));
                        }
                        else
                        {
                            file++;
                        }
                    }
                }
            }
            while(FindNextFile(hFindF, &FindFileDataF));
 
            GFile += file;
            GDir += dir;
 
            wchar_t countFileBuffer[10] = { 0 };
            wchar_t countDirectoryBuffer[10] = { 0 };
 
            wsprintf(countFileBuffer, L"%d", GFile);
            SetWindowText(hFileCount, countFileBuffer);
            wsprintf(countDirectoryBuffer, L"%d", GDir);
            SetWindowText(hDirCount, countDirectoryBuffer);
 
            FindClose(hFindF);
        }
        buf[0] = L'\0';
        //szBuf[0] = L'\0';
    }
SizeArr это функция которая считает длинну строки
C
1
2
3
4
5
6
7
8
9
int SizeArr(wchar_t arr[])
    {
        int i = 0;
        while (arr[i] != NULL)
        {
            i++;
        }
        return i;
    }
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
14.04.2014, 23:08
qwertun, getlasterror вызывай. Логируй в файл операции... Может найдёш в чём проблема и почему.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
01.05.2014, 16:46
Izual, надеюсь на Вашу помощь.
Вобщем делаю ту часть программы которая должна отвечать за оповещения пользователя при изменении содержимого диска. Впринцыпи она это делает, но есть одно НО: программа ничего больше не делает кроме ожидания изменений.
Код:
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
#include <windows.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
void PrintNotifyInfo(PFILE_NOTIFY_INFORMATION pNotify)
{
    // 1 - создание
    // 2 - удаление
    // 3 - хз шо, ни разу не встречал
    // 4 - переименование (шо было)
    // 5 - переименование (шо стало)
 
    WCHAR szwFileName[MAX_PATH];
    ULONG ulCount = min(pNotify->FileNameLength/2, MAX_PATH-1);
    wcsncpy(szwFileName, pNotify->FileName, ulCount);
    szwFileName[ulCount] = L'\0';
    wprintf(L"%d. %s\n", pNotify->Action, szwFileName);
}
 
void check()
{
    LPCTSTR lpszRootFolder = "D:\\";
    
    HANDLE hDir = CreateFile(lpszRootFolder,
            GENERIC_READ,
            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
            NULL,
            OPEN_EXISTING,
            FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
            NULL
            );
 
    OVERLAPPED o = {};
    o.hEvent = CreateEvent(0, FALSE, FALSE, 0);
 
    DWORD nBufferLength = 60*1024;
    BYTE* lpBuffer = new BYTE[nBufferLength];
    bool bStop = false;
    while(!bStop)
    {
        DWORD returnedBytes = 0;
        ReadDirectoryChangesW(hDir, lpBuffer, nBufferLength, TRUE,
            FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME,
            &returnedBytes, &o, 0);
 
        DWORD dwWaitStatus = WaitForSingleObject(o.hEvent, INFINITE);
 
        switch(dwWaitStatus) 
        { 
        case WAIT_OBJECT_0: 
            {
                DWORD seek = 0;
                while(seek < nBufferLength)
                {
                    PFILE_NOTIFY_INFORMATION pNotify = PFILE_NOTIFY_INFORMATION(lpBuffer + seek);
                    seek += pNotify->NextEntryOffset;
 
                    PrintNotifyInfo(pNotify);
 
                    if(pNotify->NextEntryOffset == 0)
                    {
                        break;
                    }
                }
            }
            break; 
        default: 
            bStop = true;
            break;
        }
    }
 
    CloseHandle(o.hEvent);
    delete [] lpBuffer;
}
 
void main()
{
    check();
    cout<<"qwe"<<endl;
    system("pause");
}
Хотелось бы узнать как сделать это ожидание изменений в фоновом режиме?

З.Ы. Чтоб не поганить основной проект сделал отдельной прожкой.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
01.05.2014, 17:12
qwertun, я в общем то и сам нуб =)
Что то я не понял, что значит в фоновом режиме?..
Вообще у вас получается каждое мгновение вызывается функция ReadDirectoryChanges в безконечном while цикле. Вот я бы это изменил, по идее же(ну я предполагаю) что работа функции должна быть только когда что то произошло, т.е. как в оконной процедуре. Не знаю, может какой то хук(чтоб перехватить сообщение изменения) есть на подобное...
Думаю вам стоит побольше почитать, вот например http://msdn.microsoft.com/en-u... s.85).aspx
там есть ссылка на "изменение в журнале"... может там что то есть путное.
0
11 / 11 / 1
Регистрация: 22.12.2012
Сообщений: 508
01.05.2014, 17:41
Цитата Сообщение от Izual Посмотреть сообщение
Что то я не понял, что значит в фоновом режиме?..
очень просто Ватсон)))
Если посмотреть в код то там есть строки
C
1
2
check();
cout<<"qwe"<<endl;
функция check вызывается и на этом программа останавливается, она не выходит из функции и qwe не выводится на экран, мне нужно сделать так чтобы и то и то одновременно было, тоесть и в функции и qwe не экране, и я хз как это сделать

Добавлено через 6 минут
меня осенило!!!!
C
1
void check()
меняем на
C
1
void CALLBACK check()
а в меинне пишем
C
1
2
3
4
5
6
7
8
void main()
{
    //check();
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)check, 0, 0, 0);
    int i;
    cout<<"qwe"<<endl;
    cin>>i;
}
cin>>i; нада шоб консоль осталась
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2014, 17:41

Рекурсивный обход (FindFirstFile, FindNextFile)
Здравствуйте. Перед мной стоит задача выполнить поиск и некоторую работу со всеми файлами в определенном каталоге, количества директорий и...

WIN32 FindFirstFile и FindNextFile возвращают некорректное время
Здравствуйте. При листинге каталога Windows функциями FindFirstFile и FindNextFile таким образом: bool ListLocalDirectory(HANDLE...

FindNextFile
#include &lt;Windows.h&gt; #include &lt;iostream&gt; int main(int argc, TCHAR *argv) { WIN32_FIND_DATA dt; HANDLE handle; handle =...

FindNextFile в do {} while()
Здравствуйте. Хочу перебрать в цикле все файлы и папки в папке. Использую такой код: GetCurrentDirectory(9999, Buffer); //...

Функция FindFirstFile
Нужно получить размер файла с помощью функции FindFirstFile.Но параметры nFileSizeHigh и nFileSizeLow хранятся в неудобном формате....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru