GetLogicalDriveStrings获取盘符例程:
//函数功能:获取驱动器 参数:路径名 void CPicTestDlg::GetLogicalDrives(HTREEITEM hParent) { //获取系统分区驱动器字符串信息 size_t szAllDriveStrings = GetLogicalDriveStrings(0, NULL); //驱动器总长度 if (m_pDriveStrings == NULL) { m_pDriveStrings = new TCHAR[szAllDriveStrings + sizeof(_T(""))]; //建立数组 } // TCHAR m_pDriveStrings = new TCHAR[szAllDriveStrings + sizeof(_T("")); GetLogicalDriveStrings(szAllDriveStrings, m_pDriveStrings); USES_CONVERSION; size_t szDriveString = strlen(T2A(m_pDriveStrings)); //驱动大小 while (szDriveString > 0) { m_MyTree.InsertItem(m_pDriveStrings, hParent); //在父节点hParent下添加盘符 m_pDriveStrings += szDriveString + 1; //m_pDriveStrings即C:\ D:\ E:\盘 szDriveString = strlen(T2A(m_pDriveStrings)); } // delete pDriveStrings; }
此例程是把盘符放在tree control下的例程
GetLogicalDriveStrings函数解析
DWORD WINAPI GetLogicalDriveStrings( _In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer );
参数:
DWORD nBufferLength
在TCHAR中,由lpBuffer指向的缓冲区的最大大小。 该大小不包括终止空字符。 如果此参数为零,则不使用lpBuffer。
LPTSTR lpBuffer
指向缓冲区的指针,它接收一系列以null结尾的字符串,一个用于系统中的每个有效驱动器,另外还有一个额外的空字符。 每个字符串都是设备名称。
返回值:
如果函数成功,则返回值是复制到缓冲区的字符串的长度(以字符为单位),不包括终止空字符。 请注意,ANSI-ASCII空字符使用一个字节,但Unicode(UTF-16)空字符使用两个字节。
如果缓冲区不够大,则返回值大于nBufferLength。 这是保存驱动器字符串所需的缓冲区的大小。
如果函数失败,返回值为零。 要获得扩展的错误信息,请使用GetLastError函数。
备注:
缓冲区中的每个字符串可用于需要根目录的任何地方,例如GetDriveType和GetDiskFreeSpace函数。
此函数返回全局和本地MS-DOS设备名称空间中驱动器的串联。 如果在两个名称空间中均存在驱动器,则此函数将返回本地MS-DOS设备名称空间中的条目。 有关更多信息,请参阅定义MS DOS设备名称。
官方例程
#include <windows.h> #include <stdio.h> #include <tchar.h> #include <string.h> #include <psapi.h> #include <strsafe.h> #define BUFSIZE 512 BOOL GetFileNameFromHandle(HANDLE hFile) { BOOL bSuccess = FALSE; TCHAR pszFilename[MAX_PATH+1]; HANDLE hFileMap; // Get the file size. DWORD dwFileSizeHi = 0; DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); if( dwFileSizeLo == 0 && dwFileSizeHi == 0 ) { _tprintf(TEXT("Cannot map a file with a length of zero.\n")); return FALSE; } // Create a file mapping object. hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL); if (hFileMap) { // Create a file mapping to get the file name. void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); if (pMem) { if (GetMappedFileName (GetCurrentProcess(), pMem, pszFilename, MAX_PATH)) { // Translate path with device name to drive letters. 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 { // Copy the drive letter to the template string *szDrive = *p; // Look up each device name if (QueryDosDevice(szDrive, szName, MAX_PATH)) { size_t uNameLen = _tcslen(szName); if (uNameLen < MAX_PATH) { bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0 && *(pszFilename + uNameLen) == _T('\\'); if (bFound) { // Reconstruct pszFilename using szTempFile // Replace device path with DOS path TCHAR szTempFile[MAX_PATH]; StringCchPrintf(szTempFile, MAX_PATH, TEXT("%s%s"), szDrive, pszFilename+uNameLen); StringCchCopyN(pszFilename, MAX_PATH+1, szTempFile, _tcslen(szTempFile)); } } } // Go to the next NULL character. while (*p++); } while (!bFound && *p); // end of string } } bSuccess = TRUE; UnmapViewOfFile(pMem); } CloseHandle(hFileMap); } _tprintf(TEXT("File name is %s\n"), pszFilename); return(bSuccess); } int _tmain(int argc, TCHAR *argv[]) { HANDLE hFile; if( argc != 2 ) { _tprintf(TEXT("This sample takes a file name as a parameter.\n")); return 0; } hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hFile == INVALID_HANDLE_VALUE) { _tprintf(TEXT("CreateFile failed with %d\n"), GetLastError()); return 0; } GetFileNameFromHandle( hFile ); }
例程:Obtaining a File Name From a File Handle
从文件句柄获取文件名称
参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx