![](/img/trans.png)
[英]How to find the drive letter of an USB mass storage drive using VID and PID in C#?
[英]find serial number of USB drive using drive letter c#
ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
foreach (ManagementObject currentObject in theSearcher.Get())
{
ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
MessageBox.Show(theSerialNumberObjectQuery["SerialNumber"].ToString());
}
這段代碼返回USB驅動器的序列號,但是我需要使用驅動器號或驅動器路徑(對於特定驅動器)查找序列號
我看到的獲取序列號的唯一方法是使用Win32(PInvoke):
class Program
{
static void Main(string[] args)
{
var volumeInfo = VolumeInformation.GetVolumeInformation("c");
}
}
[DebuggerDisplay("{ Volume,nq} ({ Name,nq })")]
class VolumeInformation
{
#region Fields
private const int BufferLength = 256;
#endregion
#region Properties
public string Volume
{
get;
}
public string Name
{
get;
}
public uint SerialNumber
{
get;
}
public string SystemName
{
get;
}
#endregion
#region Constructors
private VolumeInformation(string volume, string name, uint serialNumber, string systemName)
{
Volume = volume;
Name = name;
SerialNumber = serialNumber;
SystemName = systemName;
}
#endregion
#region Methods
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool GetVolumeInformation(string letter, StringBuilder name, uint nameSize, out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder systemName, uint systemNameSize);
public static VolumeInformation GetVolumeInformation(string volume)
{
var name = new StringBuilder(BufferLength);
var systemName = new StringBuilder(BufferLength);
var serialNumber = 0u;
var serialNumberLength = 0u;
var flags = 0u;
volume = (volume ?? String.Empty).Trim();
if(volume.Length == 1)
{
volume = $"{volume}:\\";
}
if(!volume.EndsWith(@"\"))
{
volume = $"{volume}\\";
}
if (GetVolumeInformation(volume, name, BufferLength, out serialNumber, out serialNumberLength, out flags, systemName, BufferLength))
{
return new VolumeInformation(volume, name.ToString(), serialNumber, systemName.ToString());
}
else
{
return null;
}
}
#endregion
}
我還沒有填充標志信息,但這可以從Win32返回的標志中看出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.