Получение имени файла из дескриптора файла


Пример ниже получает имя файла из его дескриптора, используя объект "проецируемый файл". Используются функции CreateFileMapping и MapViewOfFile, чтобы создать отображение. Затем, используется функция GetMappedFileName, чтобы получить имя файла. Для удаленных файлов,  печатается путь к устройству, полученный от этой функции. Для локальных файлов, преобразуется путь, чтобы использовать имя диска и печатает этот путь. Чтобы проверить этот код, создайте функцию main, которая открывает файл, используя CreateFile и передает полученный дескриптор GetFileNameFromHandle.

При использовании этого типового кода, убедитесь, что добавили стандартное выявление ошибок для всех функций.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>

#define BUFSIZE 512

BOOL GetFileNameFromHandle(HANDLE hFile) 
{
  BOOL bSuccess = FALSE;
  TCHAR pszFilename[MAX_PATH+1];
  
BOOL GetFilenameFromHandle(HANDLE hFile) 
{

  BOOL bSuccess = FALSE;
  TCHAR pszFilename[MAX_PATH+1];
  HANDLE hFileMap;

  // Получим размер файла.
  DWORD dwFileSizeHi = 0;
  DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); 
   if( dwFileSizeLo == 0 && dwFileSizeHi == 0 ) 
     { 
      printf("Не может отобразить файл нулевой длины.\n");
      return FALSE;
     }
  // Создадим объект "проецируемый файл".
         hFileMap = CreateFileMapping(hFile, 
                                      NULL, 
                                      PAGE_READONLY,
                                      0, 
                                      1,
                                      NULL);

  if (hFileMap) 
  {
    // Создадим проецируемый файл, чтобы получить имя файла.
    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

    if (pMem) 
    {
      if (GetMappedFileName (GetCurrentProcess(), 
                             pMem, 
                             pszFilename,
                             MAX_PATH)) 
      {

        // Преобразуем путь к имени устройства
        // в имя диска.
        TCHAR szTemp[BUFSIZE];
        szTemp[0] ='\0' ;

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

          do {
            // Копируем имя диска в строку шаблона,
            // удалив обратный слэша (/).
            *szDrive = *p;

            // Найдем имя каждого устройства.
            if (QueryDosDevice(szDrive, szName, BUFSIZE)) 
              {
              UINT uNameLen = _tcslen(szName);

              // Если оно больше чем длина имени файла, оно не соответствует соглашение об именах.
              if (uNameLen < MAX_PATH) 
		{
                bFound = _tcsnicmp(pszFilename, szName,
                                   uNameLen)== 0;

                if (bFound) 
                  {
             // Перестроим pszFilename используя szTemp как временную память,
             // и заменим путь устройства на наш путь в синтаксисе DOS.
                  TCHAR szTempFile[MAX_PATH];
                  _stprintf(szTempFile,
                            TEXT("%s%s"),
                            szDrive,
                            pszFilename+uNameLen);
                  _tcsncopy(pszFilename, szTempFile, MAX_PATH);
                }
              }
            }

            // Перейдем к следующему символу ПУСТО (NULL).
            while (*p++);
          } while (!bFound && *p); // конец строки
        }
      }
      bSuccess = TRUE;
      UnmapViewOfFile(pMem);
    } 

    CloseHandle(hFileMap);
  }
  printf("Имя файла %s\n", pszFilename);
  return(bSuccess);
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz