How do I check the type of sdcard's filesystem?

前端 未结 2 1900
逝去的感伤
逝去的感伤 2020-12-20 06:46

How to check the type of sdcard\'s filesystem?

For example, in Windows we can see NTFS, FAT32, exFAT, etc.

Thanks in advance.

相关标签:
2条回答
  • 2020-12-20 07:33

    For custom path, we can use this static method:

    public static String getFileSystem(File path){
        try{
            Process mount = Runtime.getRuntime().exec("mount");
            BufferedReader reader = new BufferedReader(new InputStreamReader(mount.getInputStream()));
            mount.waitFor();
    
            String line;
            while ((line = reader.readLine()) != null) {
                String[] split = line.split("\\s+");
                for (int i = 0; i < split.length - 1; i++){
                    if (!split[i].equals("/") && path.getAbsolutePath().startsWith(split[i]))
                        return split[i + 1];
                }
            }
            reader.close();
            mount.destroy();
        }catch(IOException | InterruptedException e){
            e.printStackTrace();
        }
        return null;
    }
    

    For example, below code:

    Log.i("---", "Filesystem = "+ getFileSystem(Environment.getExternalStorageDirectory()));
    

    will produce this output:

    I/---: Filesystem = vfat
    
    0 讨论(0)
  • 2020-12-20 07:43

    One solution is to run the mount command then do some string processing on the result:

        try{
            Process mount = Runtime.getRuntime().exec("mount");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mount.getInputStream()));
            mount.waitFor();
    
            String extPath = Environment.getExternalStorageDirectory().getAbsolutePath();
            String line;
            while ((line = bufferedReader.readLine()) != null)
            {
                String[] split = line.split("\\s+");
                for(int i = 0; i < split.length - 1; i++)
                {
                    if(split[i].contentEquals(extPath) ||
                        split[i].contains("sdcard") ||
                        split[i].contains("_sd") ||
                        split[i].contains("extSd") ||
                        split[i].contains("_SD"))   // Add wildcards to match against here
                    {
                        String strMount = split[i];
                        String strFileSystem = split[i+1];
    
                        // Add to a list/array of mount points and file systems here...
                        Log.i("SDCard", "mount point: "+ strMount + " file system: " + strFileSystem);
                    }
                }
            }           
        }catch(IOException e){
            e.printStackTrace();            
        }catch(InterruptedException e){
            e.printStackTrace();            
        }
    

    Running this on my G Pro gave me the following results:

    mount point: /mnt/media_rw/external_SD file system: vfat
    mount point: /storage/external_SD file system: fuse
    

    Some common Android file system types:

    • yaffs/yaffs2 - Yet Another Flash File System
    • ext4 - Extended File System version 4
    • fuse - File System in User Space
    • tmpfs - Temporary File System
    • vfat - FAT file system extension
    0 讨论(0)
提交回复
热议问题