2012-02-25 2 views

risposta

4

N.B. Questo è valido solo per Java in esecuzione sul sistema di Windows:

Utilizzando JNA, è possibile chiamare Win32 Kernel32 GetVolumeInformation() per recuperare lpFileSystemNameBuffer parametro che receives the name of the file system, for example, the FAT file system or the NTFS file systemhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx

Kernel32.java:

package filesystem; 


import java.util.HashMap; 
import java.util.Map; 

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.platform.win32.WinDef.DWORD; 
import com.sun.jna.ptr.IntByReference; 
import com.sun.jna.win32.StdCallLibrary; 
import com.sun.jna.win32.W32APIFunctionMapper; 
import com.sun.jna.win32.W32APITypeMapper; 

public interface Kernel32 extends StdCallLibrary { 

    final static Map<String, Object> WIN32API_OPTIONS = new HashMap<String, Object>() { 

     private static final long serialVersionUID = 1L; 

     { 
      put(Library.OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE); 
      put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE); 
     } 
    }; 

    public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class, WIN32API_OPTIONS); 

    /* 
    BOOL WINAPI GetVolumeInformation(
      __in_opt LPCTSTR lpRootPathName, 
      __out  LPTSTR lpVolumeNameBuffer, 
      __in  DWORD nVolumeNameSize, 
      __out_opt LPDWORD lpVolumeSerialNumber, 
      __out_opt LPDWORD lpMaximumComponentLength, 
      __out_opt LPDWORD lpFileSystemFlags, 
      __out  LPTSTR lpFileSystemNameBuffer, 
      __in  DWORD nFileSystemNameSize 
      ); 
    */ 
    public boolean GetVolumeInformation(
      String lpRootPathName, 
      char[] lpVolumeNameBuffer, 
      DWORD nVolumeNameSize, 
      IntByReference lpVolumeSerialNumber, 
      IntByReference lpMaximumComponentLength, 
      IntByReference lpFileSystemFlags, 
      char[] lpFileSystemNameBuffer, 
      DWORD nFileSystemNameSize 
      ); 

    public int GetLastError(); 
} 

VolumeInformation.java:

package filesystem; 

import ping.Kernel32; 

import com.sun.jna.platform.win32.WinDef.DWORD; 
import com.sun.jna.ptr.IntByReference; 

public class VolumeInformation { 

    static void getFileSystemName(){ 
     char[] lpVolumeNameBuffer = new char[256]; 
     DWORD nVolumeNameSize = new DWORD(256); 
     IntByReference lpVolumeSerialNumber = new IntByReference(); 
     IntByReference lpMaximumComponentLength = new IntByReference(); 
     IntByReference lpFileSystemFlags = new IntByReference(); 

     char[] lpFileSystemNameBuffer = new char[256]; 
     DWORD nFileSystemNameSize = new DWORD(256); 

     lpVolumeSerialNumber.setValue(0); 
     lpMaximumComponentLength.setValue(256); 
     lpFileSystemFlags.setValue(0); 

     Kernel32.INSTANCE.GetVolumeInformation(
       "C:\\", 
       lpVolumeNameBuffer, 
       nVolumeNameSize, 
       lpVolumeSerialNumber, 
       lpMaximumComponentLength, 
       lpFileSystemFlags, 
       lpFileSystemNameBuffer, 
       nFileSystemNameSize); 

     System.out.println("Last error: "+Kernel32.INSTANCE.GetLastError()+"\n\n"); 

     String fs = new String(lpFileSystemNameBuffer); 
     System.out.println(fs.trim()); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     getFileSystemName(); 
    } 

}