Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
артист
93 / 19 / 5
Регистрация: 17.09.2014
Сообщений: 1,178
Завершенные тесты: 2
#1

Оптимизация кода - C++

19.12.2015, 13:42. Просмотров 220. Ответов 6
Метки нет (Все метки)

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

Так - то всё работает, но мне кажется использование функций из разных языков неправильно...

Кликните здесь для просмотра всего текста
C++ (Qt)
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <windows.h>
#include <iostream>
#include <string>
#include <map>
 
#define BUFSIZE 1024
#define MD5LEN  16
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATA winFileData;
    DWORD dwStatus = 0;
    DWORD cbRead = 0;
    DWORD cbHash = 0;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    HANDLE dFile = NULL;
    HANDLE hFile = NULL;
    BOOL bResult = FALSE;
    BYTE rgbFile[BUFSIZE];
    BYTE rgbHash[MD5LEN];
    CHAR rgbDigits[] = "0123456789abcdef";
    CHAR md5str[MD5LEN * 2 + 1] = "\0";
    INT allfiles = 0, copies = 0;
    WCHAR szPath[MAX_PATH], exp[10];
    WCHAR szPathM[MAX_PATH];
    WCHAR szPathTo[MAX_PATH] = L"Копии";
    int i = 0;
 
    std::multimap <std::string, std::wstring> md5filename;
 
    if(!GetCurrentDirectoryW(sizeof(szPath), szPath)) 
    {
        std::cout << L"Невозможно получить текущую папку" << std::endl;
        system("pause");
        return 0;
    }
    std::wcout << L"Текущая папка : " << szPath << L'\\' << std::endl << std::endl << L"Введите расширение файлов : ";
 
    lstrcat(szPath, L"\\*.");
 
    std::wcin >> exp;
 
    lstrcat(szPath, exp);
 
    std::wcout << std::endl;
 
    if((dFile = FindFirstFile(szPath, &winFileData)) == INVALID_HANDLE_VALUE)
    {
        std::cout << L"Нет файлов в папке" << std::endl << std::endl;
        system("pause");
        return 0;
    }
    while (!CreateDirectory(szPathTo, NULL)) wsprintf(szPathTo, L"Копии (%i)", ++i); // Создать папку для копий
    
 
    do // Цикл по файлам
    {
        if(winFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; // Если это не файл - тогда дальше
 
        hFile = CreateFile(winFileData.cFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 
        if(hFile == INVALID_HANDLE_VALUE) // Попытка открыть файл для чтения 
        {
            std::wcout << L"Невозможно открыть файл " << winFileData.cFileName << std::endl;
            continue;
        }
        if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
        {
            dwStatus = GetLastError();
            std::wcout << std::endl << L"Ошибка, не удалось получить контекст: " << dwStatus << std::endl << std::endl;
            CloseHandle(hFile);
            continue;
        }
        if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
        {
            dwStatus = GetLastError();
            std::wcout << std::endl << L"Ошибка, не удалось получить контекст: " << dwStatus << std::endl << std::endl;
            CloseHandle(hFile);
            CryptReleaseContext(hProv, 0);
            continue;
        }
        while(bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))
        {
            if(cbRead == 0) break;
 
            if(!CryptHashData(hHash, rgbFile, cbRead, 0))
            {
                dwStatus = GetLastError();
                std::wcout << std::endl << L"Ошибка, не удалось получить хэш: " << dwStatus << std::endl << std::endl;
                CryptReleaseContext(hProv, 0);
                CryptDestroyHash(hHash);
                CloseHandle(hFile);
                continue;
            }
        }
        if(!bResult)
        {
            dwStatus = GetLastError();
            std::wcout << std::endl << L"Ошибка, не удалось прочитать файл: " << dwStatus << std::endl << std::endl;
            CryptReleaseContext(hProv, 0);
            CryptDestroyHash(hHash);
            CloseHandle(hFile);
            continue;
        }
        cbHash = MD5LEN;
 
        if(CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
        {
 
            for(int j = 0, i = 0; i < cbHash; i++)
            {
                md5str[j++] = rgbDigits[rgbHash[i] >> 4];
                md5str[j++] = rgbDigits[rgbHash[i] & 0xf];
            }
            md5filename.insert(std::pair<std::string, std::wstring>((std::string)md5str, (std::wstring)winFileData.cFileName));
            allfiles++;
        }
        else
        {
            dwStatus = GetLastError();
            std::wcout << std::endl << L"Ошибка, не удалось получить параметры : " << dwStatus << std::endl << std::endl;
        }
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        CloseHandle(hFile);
    }
    while(FindNextFile(dFile, &winFileData));
 
    std::wcout << std::endl << std::endl << "-----------------------------------------------------" << std::endl;
 
    std::string previos, first; // Для хранения предыдущего и текущего хэша
    std::wstring pname, fname;  // Для хранения предыдущего и текущего имёни файла
 
    for(auto it = md5filename.begin(); it != md5filename.end(); it++) // Вывод одинаковых файлов
    {
        first = it->first;          // Запись текущего хэша
 
        if (first == previos)       // Если текущий хэш равен предыдущему
        {
            fname = it->second;     // Получить имя файла (текущее)
            std::wcout << fname << std::endl;   // Вывести имя файла
 
            wsprintfW(szPathM, L"%s\\%s", szPathTo, fname.c_str()); // Форматирование нового пути файла
            MoveFileEx(fname.c_str(), szPathM, MOVEFILE_REPLACE_EXISTING);  // Переместить копию в папку копий
 
            copies++;               // Посчитать копию
        }
        else                        // Если хэш не равен предыдущему
        {
            previos = first;        // Записать новый хеш
            pname = it->second;     // Получить имя файла (предыдущее)
 
            std::cout << std::endl << first;
            std::wcout << L" : Копий - " << md5filename.count(first) << std::endl; // Вывести хеш и число копий
            std::wcout << pname << std::endl; // Вывести имя файла
        }
    }
    std::wcout << std::endl << std::endl << L"Всего найдено файлов - " << allfiles << L" Найдено копий - "<< copies << std::endl << std::endl;
 
    if(!copies) RemoveDirectory(szPathTo);
    system("pause");
    return 0;
}


Кто может подсказать, сколько тут их и на каком предпочтительнее?
Просто я совсем не понимаю где есть что...

Вот например, std::multimap - сортировка без него невозможна(замена на циклы с чарами не особо хочется + безразмерный массив не знаю как делать)

Вот на каком это языке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2015, 13:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Оптимизация кода (C++):

Оптимизация кода - C++
Как сравнить 2 строки. Вот как их задавал в ходе программы string h,b; ... char * text = NULL; if ( OpenClipboard(0) ) { ...

оптимизация кода - C++
Задача: определить, является ли последовательность скобок действительной. Длинна строки не превышает 100000. Например: № Input Output ...

Оптимизация кода (C++) - C++
Добрый вечер. У меня есть две функции. Вопрос:&quot;Как оптимизировать этот код, пользуясь тем, что тела отличаются лишь несколькими строчками?&quot;...

Оптимизация кода - C++
Здравствуйте! у меня есть такая функция, которая очень часто вызывается: int fun(int x_,int y_,int z_) { for(int k=0;k&lt;80;k++) {...

Оптимизация кода - C++
Пожалуйста форумчане как можно сократить этот код Особенно от 27 до 90 строки #include &lt;iostream&gt; using namespace std; int main() ...

Оптимизация кода - C++
main: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;keyBuffer.h&quot; #include &quot;pause.h&quot; #include &lt;windows.h&gt; const char...

6
nmcf
6198 / 5509 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
19.12.2015, 15:22 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что ты вкладываешь в понятие "язык"? Это С++. Если бы ты добавил сюда Паскаль или что-то ещё, она бы просто не скомпилировалась.
1
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,089
19.12.2015, 15:42 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от артист Посмотреть сообщение
Вот например, std::multimap - сортировка без него невозможна
Просто ты не умеешь сортировать. Multimap - это реализация структуры данных, эквивалентен map, но в нем можно сопоставлять одному и тому же ключу разные значения.
Раз ты используешь multimap, то олжен предполагать, что у разных файлов может быть одинаковый хеш.
А раз так, то после сравнения хешей нужно еще и сравнить сами файлы, чтобы убедиться в том, что они совпадают.
1
артист
93 / 19 / 5
Регистрация: 17.09.2014
Сообщений: 1,178
Завершенные тесты: 2
19.12.2015, 17:07  [ТС] #4
Цитата Сообщение от nmcf Посмотреть сообщение
Что ты вкладываешь в понятие "язык"? Это С++. Если бы ты добавил сюда Паскаль или что-то ещё, она бы просто не скомпилировалась.
Ну может не язык, а реализация, не знаю как называется...

Ну вот например FindFirstFile - это вин апи?
А string, map, cout - нет...

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Просто ты не умеешь сортировать. Multimap - это реализация структуры данных, эквивалентен map, но в нем можно сопоставлять одному и тому же ключу разные значения.
Раз ты используешь multimap, то должен предполагать, что у разных файлов может быть одинаковый хэш.
А раз так, то после сравнения хэша нужно еще и сравнить сами файлы, чтобы убедиться в том, что они совпадают.
Сортировка мне бы и не была нужна, чтобы найти одинаковые строки достаточно проверять на сходство все последующие...
Я знаю что такое multimap, поэтому его и выбрал...
Ну это я не учёл...Достаточно будет просто сравнить размер файлов или crc хешэм, каким - нибудь...
0
nmcf
6198 / 5509 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
19.12.2015, 17:24 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Использовать WinAPI и STL допустимо. Или ты хочешь всё вручную программировать?
1
артист
93 / 19 / 5
Регистрация: 17.09.2014
Сообщений: 1,178
Завершенные тесты: 2
19.12.2015, 17:32  [ТС] #6
Ааа... Да кто - то мне где - то сказал, что намешано у меня, если пишешь на вин апи(С++) то и пиши...
0
nmcf
6198 / 5509 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
19.12.2015, 17:40 #7
Ну может строки имелись в виду. В WinAPI нет контейнеров, так что заменить их нечем.
1
19.12.2015, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2015, 17:40
Привет! Вот еще темы с ответами:

Оптимизация кода - C++
Положение дел таково: написана программа, которая работает и вроде все замечательно, но, вспоминая программирование, которому обучался в...

Оптимизация кода - C++
В С++ я совсем недавно, вот задали задачку: Перемножить 2 матрицы MxМ, элементами которых являются матрицы NxN. Код я вроде написал,...

оптимизация кода! - C++
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида a+x=b x+a=b a+b=x Тоесть пишешь например:...

Оптимизация кода - C++
Есть вот такой кусочек кода integer h (integer k,n) {return k–n*3 ;} . . . . . z = h (k1, n2) ; Подскажите - как его можно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru