C# 如何使用C语言删除USB驱动器#

C# 如何使用C语言删除USB驱动器#,c#,usb,usb-drive,C#,Usb,Usb Drive,我正试图编写一个应用程序来删除USB驱动器,但我找不到一个方法来做到这一点。有一个.NET类来做这件事,或者可以使用Win32 API?欢迎提供所有建议,谢谢您的帮助。这里有一个链接,指向您想要的: 解释如何做到这一点,并附带源代码,享受 我有测试2变体,WMI和Shell,Shell变体可以根据需要工作 壳牌公司 /// <summary> /// Eject USB Drice /// STA Thread is required /// </summary> //

我正试图编写一个应用程序来删除USB驱动器,但我找不到一个方法来做到这一点。有一个.NET类来做这件事,或者可以使用Win32 API?欢迎提供所有建议,谢谢您的帮助。

这里有一个链接,指向您想要的:


解释如何做到这一点,并附带源代码,享受

我有测试2变体,WMI和Shell,Shell变体可以根据需要工作

壳牌公司

/// <summary>
/// Eject USB Drice
/// STA Thread is required
/// </summary>
/// <remarks>
/// Install Shell32
/// 1. Right click project
/// 2. Click Add reference
/// 3. Click .COM tab in Add reference dialogue
/// 4. Select Microsoft Shell Controls and Automation
/// 5. Click OK
/// </remarks>
/// <param name="driveName">eg. D:</param>
private static void EjectDrive(string driveName)
{
    var staThread = new Thread(new ParameterizedThreadStart(EjectDriveShell));
    staThread.SetApartmentState(ApartmentState.STA);
    staThread.Start(driveName);
    staThread.Join();
}

private static void EjectDriveShell(object param)
{
    var driveName = param.ToString();

    var shell = new Shell();
    shell.NameSpace(17).ParseName(driveName).InvokeVerb("Eject");
}

链接文章中的下载不再可用,因此此答案不再有用。
private static void EjectDrice(string driveLetter)
{
    var scope = new ManagementScope(@"\\localhost\root\CIMV2", null);
    scope.Connect();
    var wql = $"SELECT * FROM Win32_Volume WHERE Name LIKE '{driveLetter}%'";
    var objectQuery = new ObjectQuery(wql);
    using var objectSearcher = new ManagementObjectSearcher(scope, objectQuery);
    foreach (ManagementObject classInstance in objectSearcher.Get())
    {
        using ManagementBaseObject inParams = classInstance.GetMethodParameters("Dismount");
        inParams["Force"] = false;
        inParams["Permanent"] = false;

        using ManagementBaseObject outParams = classInstance.InvokeMethod("Dismount", inParams, null);
    }
}