Как обнаружить USB-накопитель подключен?
Я хочу создать программу, которая обнаруживает, если usb (или два или более) подключены
(и скопировать все содержимое в любую папку на жестком диске)
Любые идеи? У меня это,
using System.Runtime.InteropServices;
Но это не простой способ (я считаю). Я хочу что-то легкое.
У меня есть другая идея (если (папка существует), то скопируйте) что-то, но может быть проблема с этим, и я хочу хорошее решение.
Также может быть инструмент под названием SerialPort; я могу использовать его? Если да, то как его использовать?
Ответы
Ответ 1
Легко проверить наличие съемных устройств, однако это не гарантирует, что это USB-устройство:
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);
Это вернет список всех доступных сменных устройств. Дополнительная информация:
Ответ 2
Обнаружение, если USB-накопитель вставлен, не прост. Однако это определенно возможно, и работа была сделана для вас. Вот две ссылки, каждая из которых содержит ответ о том, как это сделать в С#:
http://www.codeproject.com/KB/system/DriveDetector.aspx
http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx
Любое решение должно работать отлично для вас. Вы можете адаптировать их в соответствии с вашими потребностями.
Изменить: Вот третье решение, если вам нужно больше опций (в принципе, они все одинаковые, но выбор хорош, правда?):
http://tempuzfugit.wordpress.com/2007/10/08/external-storage-unit-detection-with-c-in-net-usb-card-readers-etc/
Ответ 3
Вот код, который работает для меня, который является частью сайта выше в сочетании с моими ранними испытаниями:
http://www.codeproject.com/KB/system/DriveDetector.aspx
Это в основном заставляет вашу форму прослушивать сообщения Windows, фильтры для USB-накопителей и (cd-dvds), захватывает структуру lparam сообщения и извлекает букву диска.
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE)
{
DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME) )
{
MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
}
if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
{
MessageBox.Show("usb out");
}
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)] //Same layout in mem
public struct DEV_BROADCAST_VOLUME
{
public int dbcv_size;
public int dbcv_devicetype;
public int dbcv_reserved;
public int dbcv_unitmask;
}
private static char DriveMaskToLetter(int mask)
{
char letter;
string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C
int cnt = 0;
int pom = mask / 2;
while (pom != 0) // while there is any bit set in the mask shift it right
{
pom = pom / 2;
cnt++;
}
if (cnt < drives.Length)
letter = drives[cnt];
else
letter = '?';
return letter;
}
Не забудьте добавить это:
using System.Runtime.InteropServices;
и следующие константы:
const int WM_DEVICECHANGE = 0x0219; //see msdn site
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
const int DBT_DEVTYPVOLUME = 0x00000002;
Ответ 4
Microsoft Code Code Pack.
Класс ShellObjectWatcher.