Нахождение MD5 файлов в папке WinApi
Есть функция для нахождения md5 одного конкретного файла, как мне ее преобразовать, чтобы она находила md5 для всех файлов в папке?
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#include <fstream>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
#define BUFSIZE 1024
#define MD5LEN 16
DWORD main()
{
DWORD dwStatus = 0;
BOOL bResult = FALSE;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hFile = NULL;
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[MD5LEN];
DWORD cbHash = 0;
CHAR rgbDigits[] = "0123456789abcdef";
LPCWSTR filename = L"C:\\ford.txt";
hFile = CreateFile(filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
dwStatus = GetLastError();
printf("Error opening file %s\nError: %d\n", filename,
dwStatus);
return dwStatus;
}
if (!CryptAcquireContext(&hProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
dwStatus = GetLastError();
printf("CryptAcquireContext failed: %d\n", dwStatus);
CloseHandle(hFile);
return dwStatus;
}
if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
dwStatus = GetLastError();
printf("CryptAcquireContext failed: %d\n", dwStatus);
CloseHandle(hFile);
CryptReleaseContext(hProv, 0);
return dwStatus;
}
while (bResult = ReadFile(hFile, rgbFile, BUFSIZE,
&cbRead, NULL))
{
if (0 == cbRead)
{
break;
}
if (!CryptHashData(hHash, rgbFile, cbRead, 0))
{
dwStatus = GetLastError();
printf("CryptHashData failed: %d\n", dwStatus);
CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
CloseHandle(hFile);
return dwStatus;
}
}
if (!bResult)
{
dwStatus = GetLastError();
printf("ReadFile failed: %d\n", dwStatus);
CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
CloseHandle(hFile);
return dwStatus;
}
cbHash = MD5LEN;
if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
{
printf("MD5 hash of file %S is: ", filename);
for (DWORD i = 0; i < cbHash; i++)
printf("%02X", int(rgbHash[i]));
printf("\n");
}
else
{
dwStatus = GetLastError();
printf("CryptGetHashParam failed: %d\n", dwStatus);
}
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
CloseHandle(hFile);
return dwStatus;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
У вас метка c++. Отлично. Убедитесь, что ваш компилятор поддерживает C++17.
Выделите свою функцию в таки функцию. Пусть, например, это
void md5forFile(const char * filename);
После этого, чтоб найти все-все-все файлы, скажем, в C:\Users с подкаталогами, просто пишете
for(auto& p: fs::recursive_directory_iterator("C:\\Users"))
if (p.is_regular_file())
md5forFile(p.path().string().c_str());
Всё.
Для широких символов - примерно так:
void md5forFile(const wchar_t* w)
{
wcout << w << endl;
}
int main()
{
for(auto& p: fs::recursive_directory_iterator("C:\\Users"))
if (p.is_regular_file())
md5forFile(p.path().wstring().c_str());
}