Как удалить USB-накопитель с помощью C #

Я пытаюсь написать приложение для удаления USB-накопителей, но не могу найти способ это сделать. Для этого есть класс .NET или можно использовать Win32 API? Все советы приветствуются, спасибо за помощь.


person doc    schedule 28.07.2009    source источник


Ответы (2)


Вот ссылка на то, что вы ищете:

Извлечение USB-дисков с помощью C #

Объясняет, как это сделать, и поставляется с исходным кодом, наслаждайтесь!

person David Menard    schedule 28.07.2009
comment
Загрузка в связанной статье больше не доступна, поэтому этот ответ больше бесполезен. - person ygoe; 09.01.2016

У меня есть тестовые 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");
}

WMI

Вы можете использовать этот сценарий, см. документация

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);
    }
}
person live2    schedule 15.02.2021