2015-02-26 10 views
-1

Итак, прежде чем люди начнут кричать «DUPLICATE!» позволь мне объяснить. Я провел последние несколько дней, пытаясь получить код C#, чтобы безопасно извлечь USB-ключ. Я пытаюсь использовать код здесь:Безопасное извлечение/размонтирование файловой системы usb на Windows 8.1 64-бит с C#

http://www.codeproject.com/Articles/13530/Eject-USB-disks-using-C

Который является единственным результатом реального кода, Google возвращает, и единственная статью, что я вижу другие люди, связывая слишком (на этом сайте и подобных) , говоря: «Эй, почему ты не попробовал сначала Google?».

Ну, я сделал, и этот код сломан многими способами. Я изменил цель компиляции для моего проекта на x86 и сделал несколько предлагаемых изменений в комментариях, и, по крайней мере, он будет работать без особых исключений. Однако все буквы дисков перечислены неправильно. Он успешно удалит мой ключ usb с меткой тома F: если я просто запустил метод «Извлечь» на каждый том, который он сообщает, но когда он выталкивает F: «подумайте, что он выталкивает том C: (в соответствии с свойством, хранящимся в этом объект устройства).

Возможно, связанная с этим проблема заключается в том, что она не правильно определяет, какие диски являются съемными. Метод IsUsb возвращает true для C: и D: два раздела на моем SSD ноутбука и false для cd-диска E: и F :, my (daemontools) и фактического ключа usb.

Я провел последние 3 дня, пробирая код самостоятельно и искал в Интернете исправления (другие люди также сообщили об этой проблеме), но если люди поняли это, они не разместили свои решения. Я разработчик * nix, создающий временный набег на этот мир, и у меня нет опыта, чтобы действительно сделать это намного дороже моего времени.

Я надеялся исправить это и просто опубликовать ответ, но мое время и терпение заканчиваются, и если я не буду выяснять это до конца дня завтра, я просто собираюсь выложить утилита командной строки с допустимой лицензией. Это было бы грубо, и я ненавижу признание поражения.

Таким образом, на благо всех, кто приходит за мной, может кто-нибудь помочь мне исправить этот код и опубликовать его там, где все могут его найти? Я был бы рад дать более подробную информацию о том, что я сделал до сих пор.

+0

http://www.codeproject.com/kb/system/RemoveDriveByLetter.aspx Вопросы, предлагающие нам отправиться в другое место, загрузить некоторый код, заставить его работать, а затем опубликовать его для вас здесь не уместно. Если вы хотите получить помощь с этим кодом, обратитесь к автору этого кода. –

+0

Я надеялся, что кто-то еще был знаком с этим кодом и исправил его, поскольку это единственный код, на который здесь указывают, как ответ на этот вопрос. Я не ожидаю случайных людей просто пойти и исправить. – mthiffau

+0

И, кроме того, мне, вероятно, потребуется столько времени, чтобы сидеть и переносить его с C++ на C# (и отлаживать его и т. Д.), Так как он просто выяснял, что случилось с библиотекой, с которой я связан. – mthiffau

ответ

1

Ну, я сам работал. Функции SetupDi возвращают дисковые устройства в другом порядке, чем их номера дисков (как указано в поле DiskNumber в структуре DISK_EXTENT). Код, с которым я связан, делает неправильное предположение: порядок, в котором файлы SetupDiEnumDevices возвращают вещи, совместим с индексами, указанными в структурах степени.

Для того, чтобы определить истинный номер диска из дисков, перечисленных с SetupDiEnumDevices, вам нужно использовать CreateFile, чтобы открыть путь для каждого из них (как найти в SP_DEVICE_INTERFACE_DETAIL_DATA структуры) и использовать IOCTL_STORAGE_GET_DEVICE_NUMBER.

+0

SetupDiEnumDeviceInterfaces, скорее. – mthiffau

+0

Было бы очень полезно, если бы вы разместили весь рабочий пример, а не просто кусочки. Своими словами ... «на благо всех, кто идет за мной». Образцы кода проекта, как правило, исчезают, так как я уверен, что вы заметили, пытаясь самостоятельно найти решение этой проблемы. – samuelesque

+0

Да, после того, как вы полностью обманули, даже задав вопрос, а затем, взяв больше, чем на день, чтобы понять, что случилось, я был очень расстроен и не чувствовал себя особенно щедрым. При 3 А.М. мое отношение было в основном «удачи всем!». Теперь я в лучшем настроении. – mthiffau