導航:首頁 > 程序命令 > linux中statfs命令

linux中statfs命令

發布時間:2024-12-03 20:15:48

『壹』 android中如何獲得外置sd卡的路徑和手機自身內存的路徑

你問的編碼?

原文:http://blog.163.com/hero_213/blog/static/39891214201162123236660/
轉載非原創。
該代碼片段可以讓我們獲取internal和external的存儲空間大小。

import java.io.File;

import android.os.Environment;
import android.os.StatFs;

public class StorageUtil {

private static final int ERROR = -1;

/**
* SDCARD是否存
*/
public static boolean externalMemoryAvailable() {
return android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
}

/**
* 獲取手機內部剩餘存儲空間
* @return
*/
public static long () {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}

/**
* 獲取手機內部總的存儲空間
* @return
*/
public static long getTotalInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
}

/**
* 獲取SDCARD剩餘存儲空間
* @return
*/
public static long () {
if (externalMemoryAvailable()) {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
} else {
return ERROR;
}
}

/**
* 獲取SDCARD總的存儲空間
* @return
*/
public static long getTotalExternalMemorySize() {
if (externalMemoryAvailable()) {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
} else {
return ERROR;
}
}
}

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卡存儲空間的總大小和可用大小了。

『貳』 和df統計的磁碟分區大小不一致

Linux下查看磁碟空間使用情況,最常使用的是和df。有一次和df統計的磁碟分區大小不一致,這是為什麼呢?二者有什麼區別?網上搜索下,大神早有總結,實踐後匯總學習下。

對待統計文件逐個系統調用fstat,獲取文件大小。它的數據是基於文件獲取的,所以有很大的靈活性,不一定非要針對一個分區,可以跨越多個分區操作。如果針對的目錄中文件很多,速度就會很慢了。

1.如果統計目錄下掛載了其他文件系統,那麼也會對這個文件系統進行統計。計算時記得將這一部分從總和中去掉。

2.如果文件被刪除,即使被其他進程引用了,命令也無法對其統計。因為stat命令找不到這個文件。

3.可以跨分區統計某些你想統計的文件大小總和。因為它們都能被stat找到並統計。

df使用系統調用statfs,直接讀取分區的超級塊superblock信息來獲取分區使用情況。它的數據是基於分區元數據的,所以只能針對整個分區。由於df直接讀取超級塊(superblock才佔用1024位元組),所以運行速度不受文件多少影響。

1. 當某個文件系統下掛載了其他分區,df不會把這個分區也統計進去。

因為df讀取的是各自分區的superblock,即使分區1掛載在分區0的目錄下,df統計分區0的時候,也只能讀取分區0的superblock。

2.由於df每次統計都是讀取superblock,所以df對文件系統中的 某個文件 進行統計時,會自動轉為統計這個 文件系統(分區)的信息 。 也就是說,df通過文件找到對應的分區掛載點。

[root@xuexi ~]# df -hT /etc/fstab

Filesystem    Type  Size  Used Avail Use% Mounted on

/dev/sda2      ext4  18G  1.7G  15G  11% /

3. df會統計因子掛載點而被隱藏的原目錄文件大小。

如果在/mnt目錄下有3G的文件,然後在/mnt上掛載了其他文件系統,/mnt下原本那3G的文件就被隱藏起來無法訪問,無法統計這部分數據大小(但會統計掛載在/mnt上的文件),但df會統計這部分信息。

4.df會統計已刪除但卻仍有進程引用的文件。

正常情況下,刪除文件會立刻釋放相關指針,並將imap和bmap中相關的點陣圖標記為未使用。bmap只要一改變,文件系統立刻就能知道每個塊組中哪些數據塊是空閑的,哪些數據塊是被使用的,這些信息都會更新到分區的superblock中。於是df能立刻統計到實時的磁碟空間信息。讀寫文件的過程以及涉及的imap和bmap,後面再研究。

常見的df和不一致情況是文件刪除的問題。當一個文件被刪除後,在文件系統目錄中已經不可見了,所以就不再統計它。然而如果此時還有運行的進程持有這個已經被刪除文件的句柄,這個文件就不會真正在磁碟中被刪除, 分區超級塊中的信息也就不會更改。這樣df仍舊會統計這個被刪除了的文件。

在home下創建一個1G大小的文件test.log,df -h /home和 -sh --max-depth=1 /home查看磁碟空間佔用情況。

tail -f  test.log &,然後rm -rf test.log。

# lsof | grep test.log

tail      23955       root    3r      REG          8,1  1048576000      7999 /home/test.log  (deleted) 

使用df -h /home和 -sh --max-depth=1 /home再次查看磁碟空間佔用情況。發現df沒有變化,而則不再統計被刪除了的文件test.log。

停止進程23955,使用df和再次查看,數據一致了。

是用戶級的程序,它不考慮Meta Data,而df命令則查看文件系統的磁碟分配圖並考慮Meta Data。df命令獲得真正的文件系統數據,而命令只查看文件系統的部分情況。

df和顯示的磁碟空間使用情況不一致的原因及處理

詳細分析和df的統計結果為什麼不一樣

閱讀全文

與linux中statfs命令相關的資料

熱點內容
pythonlensysargv 瀏覽:299
x722驅動無法編譯 瀏覽:400
解壓時顯示出錯 瀏覽:838
阿里雲配置mysql資料庫伺服器地址 瀏覽:911
關於安卓系統老化怎麼解決 瀏覽:812
php撮合交易 瀏覽:1001
決戰服務端源碼編譯 瀏覽:994
騰訊雲伺服器如何保持開啟 瀏覽:372
程序員抽煙怎麼樣 瀏覽:876
模擬器怎麼加入伺服器 瀏覽:295
yt88加密狗初始化 瀏覽:133
期貨5分鍾app哪裡有 瀏覽:509
什麼叫編譯編輯 瀏覽:462
未加密的wifi是什麼渠道 瀏覽:874
手機的文件夾怎麼卸載 瀏覽:244
php的配置文件在哪 瀏覽:119
linux安裝驅動怎麼編譯 瀏覽:259
男生解壓舞教程 瀏覽:236
壓縮彈簧尺寸怎麼寫 瀏覽:402
證券app哪裡看公司業績預測 瀏覽:426