不幸的是,要得到這個信息而不用黑客和怪異的技巧,你需要使用P/Invoke技術。 有2個選項:
- 獲取用戶或系統設置的真實標籤。這可以是「新卷」,「安裝(\ Server)」,「Contoso Pro安裝盤4」等。
- 完全按照它在資源管理器中顯示的標籤(我的電腦/此PC窗口)。這與(1)相同,但是它遵循在文件夾選項對話框中設置的用戶偏好,例如, 「隱藏驅動器號」。例: 「新卷(Q :)」
要獲取的信息如選項解釋(1),你必須使用下面的代碼:
public const string SHELL = "shell32.dll";
[DllImport(SHELL, CharSet = CharSet.Unicode)]
public static extern uint SHParseDisplayName(string pszName, IntPtr zero, [Out] out IntPtr ppidl, uint sfgaoIn, [Out] out uint psfgaoOut);
[DllImport(SHELL, CharSet = CharSet.Unicode)]
public static extern uint SHGetNameFromIDList(IntPtr pidl, SIGDN sigdnName, [Out] out String ppszName);
public enum SIGDN : uint
{
NORMALDISPLAY = 0x00000000,
PARENTRELATIVEPARSING = 0x80018001,
DESKTOPABSOLUTEPARSING = 0x80028000,
PARENTRELATIVEEDITING = 0x80031001,
DESKTOPABSOLUTEEDITING = 0x8004c000,
FILESYSPATH = 0x80058000,
URL = 0x80068000,
PARENTRELATIVEFORADDRESSBAR = 0x8007c001,
PARENTRELATIVE = 0x80080001
}
//var x = GetDriveLabel(@"C:\")
public string GetDriveLabel(string driveNameAsLetterColonBackslash)
{
IntPtr pidl;
uint dummy;
string name;
if (SHParseDisplayName(driveNameAsLetterColonBackslash, IntPtr.Zero, out pidl, 0, out dummy) == 0
&& SHGetNameFromIDList(pidl, SIGDN.PARENTRELATIVEEDITING, out name) == 0
&& name != null)
{
return name;
}
return null;
}
對於選項( 2),用SIGDN.PARENTRELATIVEEDITING
或SIGDN.NORMALDISPLAY
代替SIGDN.PARENTRELATIVEEDITING
。
注意:對於第二種情況,有也使用ShGetFileInfo()
1調用方法,但無論如何,它調用這些方法,以及不夠靈活,所以我不張貼在這裏。
注意2:請記住,在此示例中優化SHGetNameFromIDList()
的簽名。如果驅動器標籤僅用於臨時(特別是在不時重新讀取的情況下),則此示例引入小內存泄漏。爲了避免它,最後一個參數聲明爲out IntPtr
,然後使用類似
var tmp = Marshal.PtrToStringUni(ppszName);
Marshal.FreeCoTaskMem(ppszName);
注3:這個作品在Windows外殼,所以它會返回所期待的用戶,不管這種標籤的來源 - 卷標籤,用戶編輯,Autorun.inf文件或其他任何東西。
你有什麼操作系統? Win XP Home沒有名爲「DriveIcons」的密鑰! – Nayan 2010-05-16 13:53:47
@Nayan - 我正在使用Windows 7. – 2010-05-16 13:55:55
Vista中不存在密鑰。 – Pindatjuh 2010-05-16 13:59:19