SDK通过文件句柄获取文件路径

来源:互联网 发布:酒店管理系统数据库 er 编辑:程序博客网 时间:2024/05/17 22:05

/*APIHandlePath*/
//通过文件句柄获取文件路径

/*头文件*/
#include<windows.h>
#include<stdio.h>
#include<tchar.h>
#include<string.h>
#include<psapi.h>

/*预处理申明*/
#pragma comment (lib,"Psapi.lib")
#define BUFSIZE 512

/*函数申明*/
BOOL GetFileNameFromHandle(HANDLE hFile)
{

 TCHAR pszFilename[MAX_PATH];
 HANDLE hFileMap;
 PVOID pMem;
 //活的大小

 DWORD dwFileSizeHigh = 0;
 DWORD dwFileSizeLow = GetFileSize(hFile, &dwFileSizeHigh);
 if(dwFileSizeLow == 0 && dwFileSizeHigh == 0)
 {
  printf("不能Map文件大小为的文件。\n");
  return FALSE;
 }

 //创建Mapping对象
 hFileMap = CreateFileMapping(hFile,
  NULL,
  PAGE_READWRITE,
  0,
  1,
  NULL);
 if(!hFileMap)
 {
  printf("CreateFileMapping error:%d",GetLastError());
  return FALSE;
 }
 pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
 if(!pMem)
 {
  printf("MapViewOfFile error:%d",GetLastError());
  return FALSE;
 }
 //从Mapping对象获得文件名
 if(0 == GetMappedFileName(GetCurrentProcess(),
  pMem,
  pszFilename,
  MAX_PATH))
 {
  printf("GetMappedFileName error:%d\n", GetLastError());
  return FALSE;
 }
 //将驱动名转换为路径
 TCHAR szTemp[BUFSIZE] = {0};
 if( 0== GetLogicalDriveStrings(BUFSIZE-1, szTemp))
 {
  printf("GetLogicalDriveeString error:%d\n", GetLastError());
  return FALSE;
 }
 TCHAR szName[MAX_PATH];
 TCHAR szDrive[3] = {0};
 BOOL bFound = FALSE;
 PTCHAR p = szTemp;
 do
 {
  CopyMemory(szDrive, p, 2* sizeof(TCHAR));
  //通过路径查找设备名
  if(!QueryDosDevice(szDrive, szName, BUFSIZE))
  {
   printf("QueryDosDevice error:%d", GetLastError());
   return FALSE;
  }
  UINT uNameLen = lstrlen(szName);
  if(uNameLen < MAX_PATH)
  {
   //比较驱动器的设备名与文件设备名是否匹配
   bFound = strncmp(pszFilename, szName, uNameLen) == 0;
   if(bFound)
   {
    //如果匹配,说明已经找到,构造路径
    TCHAR szTempFile[MAX_PATH];
    wsprintf(szTempFile,TEXT("%s%s"), szDrive, pszFilename + uNameLen);
    lstrcpy(pszFilename, szTempFile);
   }
  }
  //循环到下一个NULL
  while( *p++);
 }while (!bFound && *p);
 UnmapViewOfFile(pMem);
 CloseHandle(hFileMap);
 printf("File Path is %s\n",pszFilename);
 return TRUE;
}

/****************************************
//int main()
//功能:查找第一个目录中第一个txt文件
//      打开文件,并根据文件句柄获得文件路径
//返回值:0代表成功,否则失败
*****************************************/
int main()
{
 HANDLE hFile;
 HANDLE hFind;
 WIN32_FIND_DATA wfd;
 hFile = FindFirstFile("*.txt", &wfd);
 if(hFind == INVALID_HANDLE_VALUE)
 {
  printf("can not find a file");
  return 1;
 }

 //CloseHandle(hFind);
 printf("find %s at current dir\n", wfd.cFileName);
 hFile = CreateFile(wfd.cFileName,
  GENERIC_READ|GENERIC_WRITE,
  0,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL);
 if(hFile == INVALID_HANDLE_VALUE)
 {
  printf("create file error:%d\n", GetLastError());
 }
 else
 {
  GetFileNameFromHandle(hFile);
 }
 CloseHandle(hFile);
 return 0;
}

原创粉丝点击