天天看點

Android擷取外部和内部存儲空間總大小

android.os下的statfs類主要用來擷取檔案系統的狀态,能夠擷取sd卡的大小和剩餘空間,擷取系統内部空間也就是/system的大小和剩餘空間等等。

      看下讀取sd卡的:

java代碼

void  readsdcard() {  

        string state = environment.getexternalstoragestate();  

        if (environment.media_mounted.equals(state)) {  

            file sdcarddir = environment.getexternalstoragedirectory();  

            statfs sf = new  statfs(sdcarddir.getpath());  

            long  blocksize = sf.getblocksize();  

            long  blockcount = sf.getblockcount();  

            long  availcount = sf.getavailableblocks();  

            log.d("" ,  "block大小:" + blocksize+ ",block數目:" + blockcount+ ",總大小:" +blocksize*blockcount/ 1024 + "kb" );  

            log.d("" ,  "可用的block數目::" + availcount+ ",剩餘空間:" + availcount*blocksize/ 1024 + "kb" );  

        }     

    }  

void readsdcard() {

     string state = environment.getexternalstoragestate();

     if(environment.media_mounted.equals(state)) {

      file sdcarddir = environment.getexternalstoragedirectory();

      statfs sf = new statfs(sdcarddir.getpath());

      long blocksize = sf.getblocksize();

      long blockcount = sf.getblockcount();

      long availcount = sf.getavailableblocks();

      log.d("", "block大小:"+ blocksize+",block數目:"+ blockcount+",總大小:"+blocksize*blockcount/1024+"kb");

      log.d("", "可用的block數目::"+ availcount+",剩餘空間:"+ availcount*blocksize/1024+"kb");

     }  

    }       然後看下讀取系統内部空間的:

void  readsystem() {  

        file root = environment.getrootdirectory();  

        statfs sf = new  statfs(root.getpath());  

        long  blocksize = sf.getblocksize();  

        long  blockcount = sf.getblockcount();  

        long  availcount = sf.getavailableblocks();  

        log.d("" ,  "block大小:" + blocksize+ ",block數目:" + blockcount+ ",總大小:" +blocksize*blockcount/ 1024 + "kb" );  

        log.d("" ,  "可用的block數目::" + availcount+ ",可用大小:" + availcount*blocksize/ 1024 + "kb" );  

void readsystem() {

     file root = environment.getrootdirectory();

  statfs sf = new statfs(root.getpath());

  long blocksize = sf.getblocksize();

  long blockcount = sf.getblockcount();

  long availcount = sf.getavailableblocks();

  log.d("", "block大小:"+ blocksize+",block數目:"+ blockcount+",總大小:"+blocksize*blockcount/1024+"kb");

  log.d("", "可用的block數目::"+ availcount+",可用大小:"+ availcount*blocksize/1024+"kb");

    }       statfs擷取的都是以block為機關的,這裡我解釋一下block的概念:

1.硬體上的 block size, 應該是"sector size",linux的扇區大小是512byte

2.有檔案系統的分區的block size, 是"block size",大小不一,可以用工具檢視

3.沒有檔案系統的分區的block size,也叫“block size”,大小指的是1024 byte

4.kernel buffer cache 的block size, 就是"block size",大部分pc是1024

5.磁盤分區的"cylinder size",用fdisk 可以檢視。

      我們這裡的block size是第二種情況,一般sd卡都是fat32的檔案系統,block size是4096.

      這樣就可以知道手機的内部存儲空間和sd卡存儲空間的總大小和可用大小了。