GetLogicalDriveStrings获取盘符(包含字符转换)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值