C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Как узнать имя файла по его хэндлу / Файлы, папки, диски / Файловая система

Как узнать имя файла по его хэндлу.

Следующий пример позволяет получить имя файла по его хэндлу путём создания обекта маппинга файла. Так же в примере распечатывается полный путь файла, включая букву диска.

 

BOOL 
GetFilenameFromHandle(HANDLE hFile) {

  BOOL bSuccess = FALSE;
  TCHAR* pszFilename[MAX_PATH+1];
  uint uMaxLenDest = 0;

  // Получаем размер файла.
  DWORD dwFileSizeHi = 0;
  DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);

  // Делаем мапинг файла.
  HANDLE hFileMap = CreateFileMapping(hFile,
                                      NULL,
                                      PAGE_READONLY,
                                      0,
                                      dwFileSizeLo,
                                      NULL);

  if (hFileMap) {
    // Маппинг для получения имени файла.
    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

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

        // Переводим путь с именем устройства в букву диска
        TCHAR szTemp[512];
        *szTemp = NULL;

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

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

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

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

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

            // Переходим к следующему нулевому символу.
            while (*p++);
          } while (!bFound && *p); // в конце строки
        }
      }
      bSuccess = TRUE;
      if (!UnmapViewOfFile(pMem)) assert(0);
    } 

    if (!CloseHandle(hFileMap)) assert(0);
  }
  return(bSuccess);
}