VC平台下获取文件的MD5值

本文介绍了一个使用C++实现的函数,用于从指定目录读取文件并计算其MD5值。该函数首先打开文件,然后通过CryptoAPI库获取文件大小,接着读取文件内容并使用MD5算法进行哈希计算。最后,它将哈希值转换为字符串形式,并返回此字符串作为文件的MD5值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 加上头文件
 #include <Wincrypt.h>
*/
BOOL CPromptApp::GetMd5(CString FileDirectory,CString &strFileMd5)  
{  
   HANDLE hFile=CreateFile(FileDirectory,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
   if (hFile==INVALID_HANDLE_VALUE)                                        //如果CreateFile调用失败  
   {   
    //提示CreateFile调用失败,并输出错误号。visual studio中可在“工具”>“错误查找”中利用错误号得到错误信息。  
    CloseHandle(hFile);
    return FALSE;
   }
   HCRYPTPROV hProv=NULL;
   if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)==FALSE)       //获得CSP中一个密钥容器的句柄
   {
    return FALSE;
   }
   HCRYPTPROV hHash=NULL;
   //初始化对数据流的hash,创建并返回一个与CSP的hash对象相关的句柄。这个句柄接下来将被    CryptHashData调用。
   if(CryptCreateHash(hProv,CALG_MD5,0,0,&hHash)==FALSE)
   {
       return FALSE;
   }
   DWORD dwFileSize=GetFileSize(hFile,0);    //获取文件的大小
   if (dwFileSize==0xFFFFFFFF)               //如果获取文件大小失败  
   {
      return FALSE;
   }
   byte* lpReadFileBuffer=new byte[dwFileSize];
   DWORD lpReadNumberOfBytes;
   if (ReadFile(hFile,lpReadFileBuffer,dwFileSize,&lpReadNumberOfBytes,NULL)==0)        //读取文件  
   {
  	return FALSE;
   }
   if(CryptHashData(hHash,lpReadFileBuffer,lpReadNumberOfBytes,0)==FALSE)      //hash文件  
   {
  	return FALSE;
   }
   delete[] lpReadFileBuffer;
   CloseHandle(hFile);          //关闭文件句柄
   BYTE *pbHash;
   DWORD dwHashLen=sizeof(DWORD);
   if (!CryptGetHashParam(hHash,HP_HASHVAL,NULL,&dwHashLen,0)) //我也不知道为什么要先这样调用CryptGetHashParam,这块是参照的msdn       
   {
 	 return FALSE;
   }
   pbHash=(byte*)malloc(dwHashLen);
   if(CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&dwHashLen,0))//获得md5值 
   {
  	for(DWORD i=0;i<dwHashLen;i++)         //输出md5值 
        {
   	    TCHAR str[2]={0};
  	    CString strFilePartM=_T("");
   	    _stprintf(str,_T("%02x"),pbHash[i]);
            strFileMd5+=str;
  	}
   } 
 
  //善后工作
   if(CryptDestroyHash(hHash)==FALSE)          //销毁hash对象  
   {
  	return FALSE;
   }
   if(CryptReleaseContext(hProv,0)==FALSE)
   {
  	return FALSE;
   }
}  
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值