Обнаружение запоминающих USB-устройств с помощью Java

История ...

Я очень люблю сериалы, но хожу домой только два раза в месяц. Остальное время я живу в доме без интернета (правда, недалеко от моего университета, так что бесплатный Wi-Fi крут! - когда он работает -), поэтому мне понадобилось небольшое программное обеспечение, которое могло бы обновить мой портативный жесткий диск с моими новыми шоу. когда я возвращаюсь домой, где файловый сервер, синхронизированный с подкастами, выполняет свою работу. Я сделал это с помощью Java, и он работает.

Проблема

Прямо сейчас у меня есть файл .properties, в котором я сохранил смонтированный каталог этого usb hd. Недостаточно. Я хочу, чтобы программное обеспечение могло обнаруживать все запоминающие USB-устройства и позволять пользователю выбирать, какое из них использовать для хранения файлов. Как я могу это сделать?

Подробности

а) он должен быть на Java (я имею в виду, он также может работать с выполнением команд локального хоста, таких как dir или что-то в этом роде)

б) мой сервер находится в Windows, но я предпочитаю, чтобы это было независимое от ОС решение


person dierre    schedule 30.09.2010    source источник
comment
Я не уверен, что Java вообще разрешен доступ к таким деталям FS - это достаточно сложно в собственном коде = / Я тоже хотел бы знать, так что давайте посмотрим, знает ли кто-нибудь.   -  person Piskvor left the building    schedule 30.09.2010
comment
Что ж, я точно знаю, что в C # у вас есть System.IO.DriveInfo. Надеюсь, что с Java есть что-то подобное.   -  person dierre    schedule 30.09.2010
comment
а) это обязательно должна быть Java? б) какая ОС?   -  person Joubert Nel    schedule 30.09.2010
comment
@rooibos: отредактировал свой вопрос с подробностями   -  person dierre    schedule 30.09.2010
comment
У меня была эта проблема некоторое время назад в XP, но я не нашел решения - посмотрите, может ли это вам помочь: stackoverflow.com/questions/733206/   -  person Piskvor left the building    schedule 30.09.2010


Ответы (3)


Хотя я не заметил этого в вашем вопросе, я предполагаю, что вы хорошо знакомы с методом File.listRoots (), который возвращает массив корней файлов.

Затем вы можете просто перебрать их и попытаться определить, являются ли они флэш-накопителями. Некоторые хаки могут быть похожи на:

File[] roots = File.listRoots();

if (roots == null) {
  // you have a different problem here.  Is it even a computer we are talking about?
}

// Iterate through roots
for (File root : roots) {
    if (root.canWrite()) {  // Or, you could use File.createTempfile with that folder
        // if root does not contain some well know files
        // Or, if root contains some well known files
        // Based on these 2 hacks, or possible other characteristics, you may be reasonably sure
    }
}

Это все, что я могу предложить. Гораздо больше можно сделать с помощью дополнительных программ, а затем вызвать их из программы Java.

person Amrinder Arora    schedule 30.09.2010
comment
Хорошо, я полагаю, вы предлагаете мне создать условия, чтобы проверить, является ли это известным устройством. например: если мой корень содержит каталог Documents and Settings, то я нахожусь в Windows XP. Правильно? - person dierre; 30.09.2010
comment
Что ж, чтобы узнать, что ОС является более простым (System.getProperty (os.name) и т. Д.). Я имел в виду отличие внешнего жесткого диска от других возможных приводов (раздел жесткого диска, iPod, CD, DVD и т. Д.). - person Amrinder Arora; 30.09.2010
comment
Что ж, мне должно понравиться ваше предложение. Я использовал listRoots для Windows и JNI для Linux с монтированием. - person dierre; 25.02.2011

Вы можете проверить проект javax.usb. В настоящее время существует две сертифицированные реализации для Linux и BSD, а также реализация для Windows (поскольку она Кажется, он еще не завершен, но я полагаю, что он позволяет вам перечислить подключенные USB-устройства).

Но я не уверен, стоит ли возможность перечисления только USB-накопителей (вместо всех накопителей, как в @Amrinder Arora ответе) принять новый набор библиотек и бороться с полузавершенной реализацией ...

person Tomas Narros    schedule 01.10.2010

Прекрасный способ предоставлен в nio. Проверь это:

import java.nio.file.*;
for(Path p:FileSystems.getDefault().getRootDirectories()){
    System.out.println(p);
}

Вы получите все корни как объекты пути;

person SandeepGodara    schedule 28.02.2014