Как я могу получить список всех дисков, а также получить соответствующий тип диска (съемный, локальный диск или CD-ROM, DVD-ROM ... и т. Д.)? - PullRequest
18 голосов
/ 22 августа 2010

Как получить список всех дисков, а также получить соответствующий тип диска (съемный, локальный диск или CD-ROM, DVD-ROM ... и т. Д.)?

Ответы [ 7 ]

22 голосов
/ 25 марта 2013

С этим кодом вы можете получить все диски и описание их типа

File[] paths;
FileSystemView fsv = FileSystemView.getFileSystemView();

// returns pathnames for files and directory
paths = File.listRoots();

// for each pathname in pathname array
for(File path:paths)
{
    // prints file and directory paths
    System.out.println("Drive Name: "+path);
    System.out.println("Description: "+fsv.getSystemTypeDescription(path));
}
9 голосов
/ 22 августа 2010

Предполагая, что это окна, используйте File.listRoots(), чтобы получить все корни.Затем используйте FileSystemView, чтобы проверить, является ли это дискетой или дисководом.Кроме этого я понятия не имею.

3 голосов
/ 22 августа 2010

Нет определения того, о чем вы спрашиваете.

У меня есть флэш-накопитель, который, когда я его подключаю, отображается как CD-ROM.После того, как я запустил программу на CD-ROM, она присоединяет второй раздел, который выглядит как жесткий диск.

У меня есть съемные дисководы CD-ROM.У меня также есть «внутренние» жесткие диски eSATA на внешней стороне моего компьютера.

Чтобы получить определение привязки для «типа» накопителя, вам пришлось бы приложить немало усилий.Почему бы вам не рассказать нам, что вы пытаетесь сделать, вместо того, чтобы спросить о том, как вы хотите это сделать?

2 голосов
/ 31 июля 2013

Если вы используете JACOB, вы можете перечислить все диски вместе с соответствующими типами:

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.EnumVariant;
import com.jacob.com.JacobObject;
import com.jacob.com.Variant;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DrivesExample
{
    public interface HasNativeValue
    {
        int getNativeValue();
    }

    public enum DriveTypeEnum implements HasNativeValue
    {
        Unknown(0),
        NoRootDirectory(1),
        RemovableDisk(2),
        LocalDisk(3),
        NetworkDrive(4),
        CompactDisc(5),
        RAMDisk(6);

        public final int nativeValue;

        DriveTypeEnum(int nativeValue)
        {
            this.nativeValue = nativeValue;
        }

        public int getNativeValue()
        {
            return nativeValue;
        }
    }

    private static <T extends Enum<T> & HasNativeValue> T fromNative(Class<T> clazz, int value)
    {
        for (T c : clazz.getEnumConstants())
        {
            if (c.getNativeValue() == value)
            {
                return c;
            }
        }
        return null;
    }

    /**
     * The drive information.
     */
    public static final class Drive
    {
        /**
         * File system on the logical disk. Example: NTFS. null if not known.
         */
        public final String fileSystem;
        /**
         * Value that corresponds to the type of disk drive this logical disk represents.
         */
        public final DriveTypeEnum driveType;
        /**
         * The Java file, e.g. "C:\". Never null.
         */
        public final File file;

        public Drive(String fileSystem, DriveTypeEnum driveType, File file)
        {
            this.fileSystem = fileSystem;
            this.driveType = driveType;
            this.file = file;
        }

        @Override
        public String toString()
        {
            return "Drive{" + file + ": " + driveType + ", fileSystem=" + fileSystem + "}";
        }
    }

    /**
     * Lists all available Windows drives without actually touching them. This call should not block on cd-roms, floppies, network drives etc.
     *
     * @return a list of drives, never null, may be empty.
     */
    public static List<Drive> getDrives()
    {
        List<Drive> result = new ArrayList<>();
        ActiveXComponent axWMI = new ActiveXComponent("winmgmts://");

        try
        {
            Variant devices = axWMI.invoke("ExecQuery", new Variant("Select DeviceID,DriveType,FileSystem from Win32_LogicalDisk"));
            EnumVariant deviceList = new EnumVariant(devices.toDispatch());
            while (deviceList.hasMoreElements())
            {
                Dispatch item = deviceList.nextElement().toDispatch();
                String drive = Dispatch.call(item, "DeviceID").toString().toUpperCase();
                File file = new File(drive + "/");
                DriveTypeEnum driveType = fromNative(DriveTypeEnum.class, Dispatch.call(item, "DriveType").getInt());
                String fileSystem = Dispatch.call(item, "FileSystem").toString();
                result.add(new Drive(fileSystem, driveType, file));
            }

            return result;
        } finally
        {
            closeQuietly(axWMI);
        }
    }

    private static void closeQuietly(JacobObject jacobObject)
    {
        try
        {
            jacobObject.safeRelease();
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

    public static void main(String[] arguments)
    {
        List<Drive> drives = getDrives();

        for (Drive drive : drives)
        {
            System.out.println(drive.toString());
        }
    }
}

Пример вывода:

Drive{C:\: LocalDisk, fileSystem=NTFS}
Drive{D:\: LocalDisk, fileSystem=NTFS}
Drive{E:\: RemovableDisk, fileSystem=NTFS}
Drive{F:\: RemovableDisk, fileSystem=FAT32}
Drive{G:\: RemovableDisk, fileSystem=null}
Drive{Y:\: NetworkDrive, fileSystem=NTFS}

Для использования JACOB, добавьте JAR и DLL из загрузки в виде библиотек в вашем проекте.Это решение Windows только конечно.

1 голос
/ 16 января 2018

Этот фрагмент кода работает в Windows. Он правильно сообщает, что USB-накопители считаются съемными, но на моем ноутбуке USB-накопитель помечен как несъемный. В любом случае, это лучшее, что я нашел без использования нативного кода.

for (Path root : FileSystems.getDefault().getRootDirectories()) {
  FileStore fileStore = Files.getFileStore(root);
  System.out.format("%s\t%s\n", root, fileStore.getAttribute("volume:isRemovable"));
}

Источник: этот файл, по-видимому, исходит от JDK

0 голосов
/ 08 августа 2018

Правильный путь - это то, как Лучано ответил со свойством isRemovable, но недавно я выиграл на win 10, что если я запускаю с USB, то USB больше не будут найдены в этом методе.

Итак, я использовал только для Windows следующие wmic-вызовы:

ArrayList<File> rootDirs = new ArrayList<File>();
if( isWin )
{


  if( i_dolog )
    LOG.info( "Windows found as OS." );
  ArrayList<String> partids = new ArrayList<String>();

  String results0 = execute( "wmic diskdrive where interfacetype='USB' assoc /assocclass:Win32_DiskDriveToDiskPartition" );
  String lines[] = results0.split( "\r\r\n" );
  for( String line : lines )
  {
    String test = "Win32_DiskPartition.DeviceID=";
    int index = line.indexOf( test );
    if( index >= 0 )
    {
      String partid = line.substring( index + test.length() + 1 );
      partid = partid.substring( 0, partid.indexOf( '"' ) );
      partids.add( partid );
    }
  }
  for( String partition : partids )
  {
    String results2 = execute( "wmic partition where (DeviceID='" + partition + "') assoc /assocclass:Win32_LogicalDiskToPartition" );
    String lines2[] = results2.split( "\r\r\n" );
    for( String line : lines2 )
    {
      String test = "Win32_LogicalDisk.DeviceID=";
      int index = line.indexOf( test );
      if( index >= 0 )
      {
        String partid = line.substring( index + test.length() + 1 );
        partid = partid.substring( 0, partid.indexOf( '"' ) );
        rootDirs.add( new File( partid + "\\" ) );
      }
    }
  }
}
0 голосов
/ 06 апреля 2014
File[] roots = File.listRoots();
for(int i=0;i<roots.length;i++)
    System.out.println("Root["+i+"]:" + roots[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...