gpt4 book ai didi

c# - 在 C# 中获取驱动器标签

转载 作者:可可西里 更新时间:2023-11-01 08:10:46 24 4
gpt4 key购买 nike

当我使用 System.IO.DriveInfo.GetDrives() 并查看其中一个驱动器的 .VolumeLabel 属性时,我看到“PATRIOT XT”,它确实是驱动器的卷标。

如果我打开“我的电脑”,我看到的却是“TrueCrypt Traveler Disk”,而且我似乎无法找到任何方法以编程方式检索该值,因为没有任何 DriveInfo 属性包含该值值(value)。我还尝试通过 WMI 的 Win32_LogicalDisk 查询信息,但那里也没有包含该值的属性。

那么知道我的电脑使用的标签叫什么吗?更重要的是,如何以编程方式检索它?

编辑:为了清楚起见,这是我正在使用的代码,然后是它输出的内容,然后是我在“我的电脑”中看到的内容(这是我想要复制的内容):

foreach (DriveInfo DI in DriveInfo.GetDrives())
richTextBox1.AppendText(
(
DI.IsReady ?
(DI.VolumeLabel.Length == 0 ? DI.DriveType.ToString() : DI.VolumeLabel) :
DI.DriveType.ToString()
)
+
" (" + DI.Name.Replace("\\", "") + ")"
+ Environment.NewLine
);
Removable (A:)Fixed (C:)CDRom (D:)PATRIOT XT (E:)Backup (Y:)Data (Z:)

我的电脑详细信息 View 显示:

Floppy Disk Drive (A:)Local Disk (C:)DVD RW Drive (D:)TrueCrypt Traveler Disk (E:)Backup (Y:)Data (Z:)

最佳答案

不幸的是,要在不使用 hack 和怪异技巧的情况下获取此信息,您需要使用 P/Invoke 技术。有 2 个选项:

  1. 获取用户或系统设置的真实标签。这可能是“新卷”、“安装(\Server)”、“Contoso Pro 安装盘 4”等。
  2. 获取与资源管理器(我的电脑/本电脑窗口)中显示的标签完全相同的标签。这与 (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.PARENTRELATIVESIGDN.NORMALDISPLAY

注意:对于选项 2,也有使用 ShGetFileInfo() 的 1-call 方法,但它无论如何都会调用这些方法,并且不太灵活,所以我没有把它张贴在这里。

注释 2:请记住,SHGetNameFromIDList() 的签名在此示例中进行了优化。如果驱动器标签只是临时使用的(特别是如果它不时被重新读取),这个例子会引入小的内存泄漏。为避免这种情况,将最后一个参数声明为 out IntPtr,然后使用类似

的内容
     var tmp = Marshal.PtrToStringUni(ppszName);
Marshal.FreeCoTaskMem(ppszName);

注意 3:这适用于 Windows shell,因此它将返回用户期望的内容,而不管此标签的来源 - 卷标、用户编辑、Autorun.inf 文件或任何其他内容。

关于c# - 在 C# 中获取驱动器标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com