从打开的文件句柄获得文件的路径(三)

 

今天从CSDN看见有人问如何从 http://community.csdn.net/Expert/TopicView1.asp?id=5164878  提问从打开的文件句柄获得文件的路径,下面是解决的办法:

#include  < Psapi.h >

#define        BUFSIZE                        
512
#pragma comment(lib,
" Psapi.lib " )
BOOL __stdcall GetFileNameFromHandle(HANDLE hFile, LPWSTR lpFileName, DWORD dwSize)
{
  BOOL bSuccess 
=  FALSE;
  WCHAR pszFilename[MAX_PATH
+ 1 ];
  HANDLE hFileMap;

  DWORD dwFileSizeHi 
=   0 ;
  DWORD dwFileSizeLo 
=  ::GetFileSize(hFile,  & dwFileSizeHi); 

  
if ( dwFileSizeLo  ==   0   &&  dwFileSizeHi  ==   0  )
  {
     
return  bSuccess;
  }

  hFileMap 
=  ::CreateFileMappingW(hFile, 
                    NULL, 
                    PAGE_READONLY,
                    
0
                    
1 ,
                    NULL);

  
if  (hFileMap) 
  {
      
void *  pMem  =  ::MapViewOfFile(hFileMap, FILE_MAP_READ,  0 0 1 );

    
if  (pMem) 
    {
        
if  (::GetMappedFileNameW(GetCurrentProcess(), 
                             pMem, 
                             pszFilename,
                             MAX_PATH)) 
      {
        WCHAR szTemp[BUFSIZE];
        szTemp[
0 =  L'\ 0 ';

        
if  (::GetLogicalDriveStringsW(BUFSIZE - 1 , szTemp)) 
        {
          WCHAR szName[MAX_PATH];
          WCHAR szDrive[
3 =  L "  : " ;
          BOOL bFound 
=  FALSE;
          WCHAR
*  p  =  szTemp;

          
do  
          {
            
* szDrive  =   * p;

            
if  (::QueryDosDeviceW(szDrive, szName, BUFSIZE))
            {
              UINT uNameLen 
=  lstrlenW(szName);

              
if  (uNameLen  <  MAX_PATH) 
              {
                  bFound 
=  ::_wcsnicmp(pszFilename, szName, 
                    uNameLen) 
==   0 ;

                
if  (bFound) 
                {
                  WCHAR szTempFile[MAX_PATH];
                  ::wsprintfW(szTempFile,
                            L
" %s%s " ,
                            szDrive,
                            pszFilename
+ uNameLen);
                  ::lstrcpynW(pszFilename, szTempFile, MAX_PATH);
                }
              }
            }

            
while  ( * p ++ );
          } 
while  ( ! bFound  &&   * p); 
        }
      }
        ::UnmapViewOfFile(pMem);
    } 

    ::CloseHandle(hFileMap);
  }

  
if (lpFileName)
  {
      ::lstrcpynW(lpFileName,pszFilename,dwSize);
      bSuccess 
=  TRUE;
  }
  
  
return (bSuccess);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值