Java에서 드라이브 정보 가져오기

 

프로젝트를 진행하다가 USB 드라이브를 찾는 부분이 있었습니다.

Java 라이브러리들이 많으니 USB 관련 자료도 많겠지.... 라고 했는데, 생각 외로 관련 자료가 없었습니다.

 

단지, 컴퓨터에 연결된 드라이브 중에서 하드디스크와 USB 가 어떤것인지 알고 싶은데 아무리 찾아도 간단한 해결 방법이 없는 것이었습니다. orz

 

jUSB라는게 있는데 최종 버전이 2003년에도 나와서 윈도우 7에서는 안되는 말도 있고 된다는 말도 있고..

되긴 되는데, 뭔가 복잡하고 dll 파일도 넣어줘야하고.... 으....

 

 

(제가 잘 못 찾는 것일 수도 있지만...) 복잡하지 않고 심플한 정보를 찾을 수 없었습니다.

 

이가 없으면 잇몸으로.. 라도 해결해야 할거 같아서 다른 방법을 찾아보았습니다.

 

 

1. 드라이브 정보

 

우선 간단하게 Java Class 파일을 만들어 줍니다.

 

public class Main {

    public static void main(String[] args) {

     // 내용 넣을 부분

    }

}

 

몇가지 검색을 해보니 File을 통해서 드라이브 정보를 얻어올 수 있었습니다.

 

File 의 루트 정보를 가져오면 드라이브 정보를 얻어올 수 있습니다.

 

File[] roots = File.listRoots();

 

위의 코드를 적용시켜 완성된 코드가 아래와 같습니다.

 

import java.io.File;
import java.text.NumberFormat;
 
public class Main {
 
    public static void main(String[] args) {
        
        String  drive;                // 드라이브 명
        double  size;                 // 드라이브의 최대 크기 = 용량
        
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMaximumFractionDigits(2);                                   // 소숫점 2자리까지만 보이게 변환

        File[] roots = File.listRoots();

        for (File root : roots) {
        
            drive = root.getAbsolutePath();
            
            size = root.getTotalSpace() / Math.pow(1024, 3);
            
            System.out.println("Drive : " + drive);
            System.out.println("Space : " + nf.format(size) + " GB");
            
        }

    }

}

 

File.listRoots() 로 드라이브 정보를 가져와서 root 에 저장을 합니다.

root 에서는 getAbsolutePath() 로 드라이브 이름을 가져오고, getTotalSpace()로 최대 용량을 가져옵니다.

 

최대용량을 보면 단위가 크기 때문에 기가바이트로 표시하기 위해서

Math 함수중 제곱을 계산하는 pow를 사용해서 1024 * 1024 * 1024 = 기가바이트로 나눠주었습니다.

 

그리고 소숫점 2자리만 보이게 하기 위해서 NumberFormat을 사용하였습니다.

 

위와 같이 작성하고 돌리면 아래와 같이 나옵니다.

 

Drive : C:\
Space : 59.53 GB
Drive : D:\
Space : 931.51 GB
Drive : E:\
Space : 1.86 GB

Drive : L:\
Space : 0 GB
Drive : R:\
Space : 0 GB

 

많은 정보를 얻을 수 있을거 같지만, 드라이브에 관련된 자료를 조금 얻었을 뿐 몇가지 없었습니다. orz

 

저 중에 E 드라이브가 USB 인데, USB 인줄 아는 방법이 없었습니다.

 

단순하게 용량으로 계산해서... 요즘 USB 가 16기가 이상은 그리 많지 않으니, 제한할까도 생각했지만 USB 외 다른 기기들 (과거 zip 드라이브 같은것들..)의 용량을 몰라서 일단 접어두었습니다.

 

 

2. Visual Basic Script

 

이리저리 고민하던 끝에... 한가지 단서를 얻을 수 있었습니다.

바로 윈도우에서는 비주얼베이직스크립트를 실행할 수 있다는 것이었습니다.

 

마음이 급하니 테스트를 하여 수정한 vbs 파일 내용입니다.

 

아래 내용은 vbs에서 사용할 수 있는 명령을 사용해서 LogicalDisk를 찾고 그 디스크의 타입을 찾는 것이었습니다.

 

검색을 해보니 2번은 USB 이고, 3번은 하드디스크를 나타내고 있었습니다.

 

Set objWMIService = GetObject("winmgmts:\\")
 
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
 
For Each objDisk in colDisks
 
    Select Case objDisk.DriveType
        
        Case 2
            Wscript.Echo objDisk.DeviceID & " Drive : "& "Removable drive."
        
    End Select
Next

 

윈도우에서 vbs 파일을 더블 클릭하니 USB 드라이브를 찾아서 알려줍니다.  

 

 

 

3. 소스 적용

 

이제 자바 소스에 vbs를 적용할 차례입니다.

 

테스트를 해보니 vbs에서 for 문이 도는 것은 읽어올 수 없었습니다.

그래서 방법을 바꿔서 드라이브 명 하나씩 대입을 해보도록 하겠습니다.

 

함수를 하나 만들어줍니다.

 

방법은 처음에 임시 파일을 생성하면서 vbs 내용을 적어주고, Process로 명령을 실행한 다음, 값을 얻어오는 것 입니다.

 

    public static String getDriveType(String drive) {
        String result = "";
        try {
            File file = File.createTempFile("test", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new java.io.FileWriter(file);
 
            String vbs =
                    "Set objWMIService = GetObject(\"winmgmts:\")\n"
                    + "Set objDisk = objWMIService.Get(\"Win32_LogicalDisk.DeviceID=\'"
                    + drive
                    + ":\'\")\n" + "Wscript.Echo objDisk.DriveType";
 
            fw.write(vbs);
            fw.close();

            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

            String line;
            while ((line = input.readLine()) != null) {
                result += line;
            }
 
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

 

위와 같이 하면 2, 3 또는 그외 숫자 들이 넘어올 것이고, 그것을 구분해서 USB 인지 하드디스크 인지 구별해주면 됩니다.

 

 

~(^_ ^ )~

 

어찌하다보니 편법?으로 프로그램을 테스트 하게 된거 같습니다.

해결방법을 못찾아서 시간을 허비 했지만, 다른 방법으로도 해결하는 법을 찾아본 경험을 하게 된거 같습니다.

 

 

혹시 Java에서 USB 관련된 정보가 있으면 공유해주세요~~