【问题标题】:identify file system format of a disk type in java like ntfs, fat16/32 or ext在 java 中识别磁盘类型的文件系统格式,如 ntfs、fat16/32 或 ext
【发布时间】:2012-02-25 04:31:10
【问题描述】:

有没有办法在java中找出磁盘的文件系统格式?

例如,对于 Windows 硬盘,它可以是 NTFS,对于 zip 驱动器,它是 FAT32。

【问题讨论】:

    标签: java filesystems


    【解决方案1】:

    注意这仅对在 Windows 系统上运行的 Java 有效:

    使用JNA,你可以调用Win32 Kernel32的GetVolumeInformation()来获取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).aspxlpFileSystemNameBuffer参数

    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();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您使用的是什么版本的 Java?

      如果 Java 7 - 看看这个 API - http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystems.html

      除此之外,我知道 System.getProperty 和 Runtime 有方法来获取正在使用的磁盘上的信息,但没有任何方法可以专门调用文件系统类型(NTFS、FAT32 等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-21
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2012-02-06
        • 2011-06-02
        相关资源
        最近更新 更多