GetLogicalDriveStrings獲取碟符(包含字元轉換)
阿新 • • 發佈:2019-01-07
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
從檔案控制代碼獲取檔名稱