Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
1

Найти и удалить все одинаковые значения в коллекции файлов

11.12.2015, 10:18. Просмотров 1021. Ответов 14
Метки нет (Все метки)

Хочу найти и удалить все одинаковые файлы.

Думаю мд5 и имя каждого файла записать в динамический массив, а потом проверить.

Но не знаю как задать в таком формате.

C
1
char array[безразмерно] [2] [64]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2015, 10:18
Ответы с готовыми решениями:

Удалить из массива все одинаковые элементы
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы,...

Удалить из массива все одинаковые элементы, оставив их первые вхождения
Дан целочисленный массив размера N. Удалить из массива все одинаковые...

Удалить из массива все одинаковые элементы, оставив их первые вхождения
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы,...

Удалить из массива все одинаковые элементы, оставив их первые вхождения
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы,...

Найти в массиве одинаковые значения
Доброе время суток.Даны массивы А из которого делается массив Б. Нужно ввести...

14
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.12.2015, 10:47 2
Лучший ответ Сообщение было отмечено артист как решение

Решение

артист, не заморачивайся, используй std::vector.
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
11.12.2015, 11:10  [ТС] 3
https://msdn.microsoft.com/ru-ru/library/9xd04bzs.aspx

Ничего не понял )
0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.12.2015, 11:22 4
Цитата Сообщение от артист Посмотреть сообщение
Ничего не понял )
Значит надо почитать в книгах про контейнеры библиотеки stl.
Рассказывать тут с нуля про шаблоны и стандартную библиотеку не считаю разумным.
3
Mesteriis
379 / 162 / 51
Регистрация: 08.08.2015
Сообщений: 1,149
Завершенные тесты: 1
11.12.2015, 11:36 5
Цитата Сообщение от артист Посмотреть сообщение
Ничего не понял )
отучайся от мелкомягких, если это конечно не косатся винапи, а так вот 5 статей которые полностью раскрывают вектор тут
1
Babysitter
210 / 127 / 50
Регистрация: 23.11.2015
Сообщений: 374
Завершенные тесты: 2
11.12.2015, 11:46 6
если челувеку нужно создать коллекцию уникальных значений, а самой частой операцией является поиск - ответ на вопрос есть хэш в коллекции или нет, то почему вы советуете vector, а не set?
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
11.12.2015, 11:51  [ТС] 7
Да мне не вектор нужен, а динамический двумерный строковый массив в 64 ячейки.

Нужно записать

C
1
2
3
4
5
6
7
     / [0] -> 86b08dd1a6fc0fa0706f7b765cdedd49
[N0]
     \ [1] -> С:\tralala\la-la.bla
 
     / [0] -> d41d8cd98f00b204e9800998ecf8427e
[N1]
     \ [1] -> С:\tralala\sdfsdfsd.ttt
Только N - динамический
0
Babysitter
210 / 127 / 50
Регистрация: 23.11.2015
Сообщений: 374
Завершенные тесты: 2
11.12.2015, 11:52 8
Лучший ответ Сообщение было отмечено артист как решение

Решение

std::map - твой выбор
ключ - строка хэша, значение - путь.
эффективный поиск по ключу.
2
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.12.2015, 12:05 9
Лучший ответ Сообщение было отмечено артист как решение

Решение

Цитата Сообщение от Babysitter Посмотреть сообщение
эффективный поиск по ключу.
тогда уж std::unordered_map
2
Babysitter
210 / 127 / 50
Регистрация: 23.11.2015
Сообщений: 374
Завершенные тесты: 2
11.12.2015, 12:24 10
так-то да, конечно. если по памяти не критично, то поиск по unordered_map лучше.
просто обычно стараюсь советовать базовые вещи, не факт, что компилятор с 0x доступен например.
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
11.12.2015, 13:44  [ТС] 11
А как правильно записать в std::map unsigned char [16] и WCHAR [260] ?
И как в unsigned char записать std::auto.first ?

Кликните здесь для просмотра всего текста
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
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include "md5.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATA winFileData;
    HANDLE hFile;
    FILE * file, * filemin, * filemax;
    wchar_t szPath[MAX_PATH];
 
    if(!GetCurrentDirectory(sizeof(szPath), szPath)) 
    {
        wcout << L"Невозможно получить текущую папку" << endl;
        system("pause");
        return 0;
    }
    wcout << L"Текущая папка : " << szPath << endl << endl;
 
    lstrcat(szPath, L"\\*.*");
 
    if((hFile = FindFirstFile(szPath, &winFileData)) == INVALID_HANDLE_VALUE)
    {
        wcout << L"Нет файлов в папке" << endl << endl;
        system("pause");
        return 0;
    }
    map <string, string> md5filename;   // Для хранения хэша и имени файла
    struct md5_ctx * md5ctx;            // Для передачи файла в функцию
    unsigned char md5result[16];        // Для записи хэша
    unsigned char * buf;                // Для чтения файла
 
    do // Цикл по файлам
    {
        if(winFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; // Если это не файл - тогда дальше
        
        if(_wfopen_s(&file, winFileData.cFileName, L"rb")) // Попытка открыть файл для чтения 
        {
            wcout << L"Невозможно открыть файл " << winFileData.cFileName << endl;
            continue;
        }
        md5_init(md5ctx); // Инициализация
 
        while(!feof(file)) // Чтение файла
        {
            buf = fgetc(file);
            md5_update(md5ctx, buf, sizeof(buf));
        }
        fclose(file);
 
        md5_final(md5ctx, md5result); // Получение хэша
 
        md5filename.insert (pair<string, string>(md5result, winFileData.cFileName)); // Запись хэша и имени
    }
    while(FindNextFile(hFile, &winFileData));
 
    unsigned char previos[16], first[16]; // Массив для хранения предыдущего и текущего хэша
 
    // Вывод одинаковых файлов
    for(auto it = md5filename.begin(); it != md5filename.end(); ++it)
    {
        first = it->first; // Запись текущего хэша
 
        if(previos == first) cout << it->second << endl; // Если предыдущий хэш был такой же, вывести только имя файла
        else // Если хэш другой
        {
            cout << endl << it->first << " :" << endl << it->second << endl; // Вывести хеш и имя файла
            previos = first; // Записать новый хеш
        }
    }
    system("pause");
    return 0;
}

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
map <string, string> md5filename;   // Для хранения хэша и имени файла
//...
md5filename.insert (pair<string, string>(md5result, winFileData.cFileName)); // Запись хэша и имени
//...
unsigned char previos[16], first[16]; // Массив для хранения предыдущего и текущего хэша
 
// Вывод одинаковых файлов
for(auto it = md5filename.begin(); it != md5filename.end(); ++it)
{
    first = it->first; // Запись текущего хэша
 
    if(previos == first) cout << it->second << endl; // Если предыдущий хэш был такой же, вывести только имя файла
    else // Если хэш другой
    {
        cout << endl << it->first << " :" << endl << it->second << endl; // Вывести хеш и имя файла
        previos = first; // Записать новый хеш
    }
}
Добавлено через 32 минуты
Вроде перестало ругаться:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
map <char, char> md5filename;       // Для хранения хэша и имени файла
 
//...
 
md5filename.insert(pair<char, char>((char)md5result, (char)winFileData.cFileName)); // Запись хэша и имени
 
//...
 
unsigned char previos, first; // Массив для хранения предыдущего и текущего хэша
 
// Вывод одинаковых файлов
for(auto it = md5filename.begin(); it != md5filename.end(); ++it)
{
    first = (unsigned char)it->first; // Запись текущего хэша
 
    if(previos == first) cout << it->second << endl; // Если предыдущий хэш был такой же, вывести только имя файла
    else // Если хэш другой
    {
        cout << endl << it->first << " :" << endl << it->second << endl; // Вывести хеш и имя файла
        previos = first; // Записать новый хеш
    }
}
0
Babysitter
210 / 127 / 50
Регистрация: 23.11.2015
Сообщений: 374
Завершенные тесты: 2
11.12.2015, 13:52 12
это все очень плохо, товарищ. похоже ты вообще не понимаешь как работают указатели и пытаешься подогнать уничтожив звездочки. теперь вместо строк ты получил простые символы, по этому оно и не ругается. а в первом варианте у тебя сравнение указателей, которое не сравнивает строки..
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
11.12.2015, 15:23  [ТС] 13
Найти и удалить все одинаковые значения в коллекции файлов


Зато скомпилировалось )
0
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
11.12.2015, 16:24  [ТС] 14
А так вылетает.
Необработанное исключение по адресу 0x5D4A70F3 (msvcr110d.dll) в Search Dublicate File.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFD8.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned char previos[17], first[17]; // Массив для хранения предыдущего и текущего хэша
 
// Вывод одинаковых файлов
for(auto it = md5filename.begin(); it != md5filename.end(); ++it)
{
    _mbscpy_s(first, (unsigned char*)it->first); // Запись текущего хэша
 
    if(!_mbscmp(previos, first)) cout << it->second << endl; // Если предыдущий хэш был такой же, вывести только имя файла
    else // Если хэш другой
    {
        cout << endl << it->first << " :" << endl << it->second << endl; // Вывести хеш и имя файла
        _mbscpy_s(previos, first); // Записать новый хеш
    }
}
Добавлено через 19 минут
_mbscpy_s нельзя использовать в приложениях, выполняемых в среде выполнения Windows.
Ппц...

Добавлено через 21 минуту
Блин да че ей надо?

C
1
wcscpy_s((wchar_t*)first, 17, (wchar_t*)it->first)
Вылетает гадина...
0
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,192
Завершенные тесты: 2
18.12.2015, 16:42  [ТС] 15
Уважаемые, как запихнуть в map<string> строку вида WHAR [260] ?

Кликните здесь для просмотра всего текста
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
148
149
#include <windows.h>
#include <Wincrypt.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <map>
 
#define BUFSIZE 1024
#define MD5LEN  16
 
using namespace std;
 
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";
    
    wchar_t szPath[MAX_PATH];
 
    map <string, string> md5filename;
 
    if(!GetCurrentDirectoryW(sizeof(szPath), szPath)) 
    {
        wcout << L"Невозможно получить текущую папку" << endl;
        system("pause");
        return 0;
    }
    wcout << L"Текущая папка : " << szPath << '\\' << endl << endl;
 
    lstrcat(szPath, L"\\*.*");
 
    if((dFile = FindFirstFile(szPath, &winFileData)) == INVALID_HANDLE_VALUE)
    {
        wcout << L"Нет файлов в папке" << endl << endl;
        system("pause");
        return 0;
    }
    
 
    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) // Попытка открыть файл для чтения 
        {
            wcout << L"Невозможно открыть файл " << winFileData.cFileName << endl << endl;
            continue;
        }
        wcout << winFileData.cFileName;
 
        if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
        {
            dwStatus = GetLastError();
            wcout << endl << L"Ошибка, не удалось получить контекст: " << dwStatus << endl << endl;
            CloseHandle(hFile);
            continue;
        }
        if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
        {
            dwStatus = GetLastError();
            wcout << endl << L"Ошибка, не удалось получить контекст: " << dwStatus << endl << 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();
                wcout << endl << L"Ошибка, не удалось получить хэш: " << dwStatus << endl << endl;
                CryptReleaseContext(hProv, 0);
                CryptDestroyHash(hHash);
                CloseHandle(hFile);
                continue;
            }
        }
        if(!bResult)
        {
            dwStatus = GetLastError();
            wcout << endl << L"Ошибка, не удалось прочитать файл: " << dwStatus << endl << endl;
            CryptReleaseContext(hProv, 0);
            CryptDestroyHash(hHash);
            CloseHandle(hFile);
            continue;
        }
        cbHash = MD5LEN;
 
        if(CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
        {
            wcout << L" MD5 хэш: ";
 
            for(DWORD j = 0, i = 0; i < cbHash; i++)
            {
                md5str[j++] = rgbDigits[rgbHash[i] >> 4];
                md5str[j++] = rgbDigits[rgbHash[i] & 0xf];
            }
            cout << md5str << endl << endl;
 
            md5filename.insert(pair<string, string>((string)md5str, (string)winFileData.cFileName));
        }
        else
        {
            dwStatus = GetLastError();
            wcout << endl << L"Ошибка, не удалось получить параметры : " << dwStatus << endl << endl;
        }
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        CloseHandle(hFile);
    }
    while(FindNextFile(dFile, &winFileData));
 
    /*string previos, first; // Массив для хранения предыдущего и текущего хэша
 
    // Вывод одинаковых файлов
    for(auto it = md5filename.begin(); it != md5filename.end(); it++)
    {
        cout << it->first << endl;
        previos = it->first; // Запись текущего хэша
 
        if(previos == first) cout << it->second << endl; // Если предыдущий хэш был такой же, вывести только имя файла
        else // Если хэш другой
        {
            cout << endl << first << " :" << endl << it->second << endl; // Вывести хеш и имя файла
            previos = first; // Записать новый хеш
        }
    }*/
    cout << endl;
    system("pause");
    return 0;
}


С горем пополам удалось получить хэш файлов...

Никак не лезет оно туда(winFileData.cFileName):

C
1
md5filename.insert(pair<string, string>((string)md5str, (string)winFileData.cFileName));
0
18.12.2015, 16:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2015, 16:42

Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы, оставив их последние вхождения
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; int main() { ...

Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы, оставив их первые вхождения.
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы,...

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


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

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

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