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

Следующий пример позволяет получить имя файла по его хэндлу путём создания обекта маппинга файла. Так же в примере распечатывается полный путь файла, включая букву диска.
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);
}
 
« Предыдущая статья   Следующая статья »