Linux下檔案屬性的獲取
在Linux下進行C/C++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。
標頭檔案“#include <sys/stat.h>”
(1) //通過檔名稱獲取檔案屬性
int stat(const char *restrict pathname, struct stat *restrict buf);
(2) //通過檔案描述符獲取檔案屬性
int fstat(int filedes, struct stat *buf);
(3) //通過符號檔名稱獲取檔案屬性
int lstat(const char *restrict pathname, struct stat *restrict buf);
返回值(三個函式一樣)
成功:0
失敗:-1
三個系統呼叫的區別:
1. fstat接受的第一個引數是“檔案描述符”,stat和lstat是“檔案全路徑”,檔案描述符需要用呼叫open之後才能得到,檔案全路經直接寫即可;
2. lstat獲取的是該符號連結本身的資訊;而stat獲取的是該連結指向的檔案的資訊;
這三個系統呼叫都依賴一個重要的結構體struct stat
struct stat { mode_t st_mode; //檔案對應的模式,檔案,目錄等 ino_t st_ino; //inode節點號 dev_t st_dev; //裝置號碼 dev_t st_rdev; //特殊裝置號碼 nlink_t st_nlink; //檔案的連線數 uid_t st_uid; //檔案所有者 gid_t st_gid; //檔案所有者對應的組 off_t st_size; //普通檔案,對應的檔案位元組數 time_t st_atime; //檔案最後被訪問的時間 time_t st_mtime; //檔案內容最後被修改的時間 time_t st_ctime; //檔案狀態改變時間 blksize_t st_blksize; //檔案內容對應的塊大小 blkcnt_t st_blocks; //偉建內容對應的塊數量 };
2. 示例程式
(1) 先在測試目錄下建立一個test.txt檔案,然後"ln -s test.txt link"建立一個符號檔案指向test.txt;
(2) 寫測試程式碼
(3) 執行結果#include <sys/stat.h> #include <fcntl.h> #include "stdio.h" #include "time.h" #include "unistd.h" void report(struct stat *ptr) { if(!ptr) { return; } printf("The device no is: %d\n", ptr->st_dev); printf("The file's node number is: %d\n", ptr->st_ino); printf("The file's access mode is: %d\n", ptr->st_mode); printf("The file's hard link number is: %d\n", ptr->st_nlink); printf("The file's user id is: %d\n", ptr->st_uid); printf("The file's group id is: %d\n", ptr->st_gid); printf("The file's size is: %d\n", ptr->st_size); printf("The block size is: %d\n", ptr->st_blksize); printf("The number of allocated blocks is: %d\n", ptr->st_blocks); struct tm* pAccesstime=localtime(&(ptr->st_atime)); struct tm* pModifytime=localtime(&(ptr->st_mtime)); struct tm* pChangetime=localtime(&(ptr->st_ctime)); char aBuffer[64] = {0}; char mBuffer[64] = {0}; char cBuffer[64] = {0}; strftime(aBuffer, 64, "The last access time is: %Y-%m-%d %H:%M:%S \n", pAccesstime); strftime(mBuffer, 64, "The last modify time is: %Y-%m-%d %H:%M:%S \n", pModifytime); strftime(cBuffer, 64, "The last change time is: %Y-%m-%d %H:%M:%S \n", pChangetime); printf(aBuffer); printf(mBuffer); printf(cBuffer); } void Test(const char* pFileName) { if(!pFileName) { printf("error: file pointer is null in Test function\n"); return; } printf("File %s is be in testing ...\n", pFileName); struct stat st; int nRev_st = stat(pFileName, &st); if(nRev_st < 0) { printf("File %s is not existed \n", pFileName); } else { printf("------get file %s info by stat \n", pFileName); report(&st); } struct stat ls; int nRev_ls = lstat(pFileName, &ls); if(nRev_ls < 0) { printf("File %s is not existed \n", pFileName); } else { printf("------get file %s info by lstat \n", pFileName); report(&ls); } struct stat fs; int fd = open(pFileName, O_RDONLY); int nRev_fs = fstat(fd, &fs); close(fd); if(nRev_fs < 0) { printf("File %s is not existed \n", pFileName); } else { printf("------get file %s info by fstat \n", pFileName); report(&fs); } } int main() { const char* pFileName_Real = "test.txt"; const char* pFileName_Link = "link"; Test(pFileName_Real); printf("\n\n"); Test(pFileName_Link); return 0; }
相關推薦
Linux下檔案屬性的獲取
1. 資料結構和系統呼叫 在Linux下進行C/C++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。 標頭檔案“#include <sys/stat.h>” (1) //通過檔名稱獲取檔案屬性 int sta
Linux下,grep獲取檔案中的最後一次匹配項
如題:使用grep獲取檔案中的最後一次匹配項 grep '查詢的內容' -A 100 檔名 | tail -n 101 grep獲取檔案中的最後一次匹配項,以及後面100行, 注意是tail -n 101而不是tail -n 100,因為tail -n 100將不會顯示匹配內
Linux 下檔案完全複製(屬性不變)
在linux中怎樣用命令完全拷貝一個目錄下的所有檔案(包括隱藏檔案以及資料夾)到另外一個目錄下,並且使得被複制的所有檔案的屬性等完全保持不變? 注意,連原來的資料夾中所有的檔案的屬性、連結等都不能更改。也就是說,要建立原來資料夾的一份一模一樣的拷貝!&n在linux
Linux下C語言獲取目錄中的檔案列表
struct stat info; stat(path,&info); if(S_ISDIR(info.st_mode)) printf("This is a directory"); stat結構及其域如下所示: struct stat {
linux下 stat statfs 獲取 檔案 磁碟 資訊
stat函式講解 表頭檔案: #include <sys/stat.h> #include <unistd.h>定義函式: int stat(const char *file_name, struct stat *buf); 函式說明: 通過
Linux下用C獲取當前時間
time() 使用 ble timespec -1 ber 區間 本地 指向 Linux下用C獲取當前時間,具體如下: 代碼(可以把clock_gettime換成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getN
linux下c語言獲取當前時間
keyword spa pre urn markdown view 技術分享 時間 tle 和時間有關的函數定義在頭文件”time.h”中 常用函數: time_t time(time_t *t); 函數說明:此函數會返回從公元 1970 年1 月1 日的UTC
linux下檔案的建立時間、訪問時間、修改時間和改變時間
Linux系統中沒有命令可以確切的檢視一個檔案的生成時間,但是可以知道訪問時間,修改時間,改變時間。 可以通過stat命令檢視一個檔案的訪問時間,修改時間,改變時間: 以下為三個時間的區別: 1、訪問時間(accesstime):讀取一次檔案的內容,該時間
Linux下C語言獲取本機IP地址
#include <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h> char* GetLocalIp() { int MA
Linux下使用java獲取cpu、記憶體使用率
原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系統中可以用top命令檢視程序使用CPU和記憶體情況,通過Runtime類的exec()方法執行命令"top”,獲取"top"的輸出,從而得到CPU和記憶體的使用情況。
Linux下管理員許可權獲取(su和sudo的區別)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Linux修改檔案屬性以及許可權
原文連結:Linux修改檔案屬性以及許可權 chgrp:改變檔案所屬使用者組 chown:改變檔案所有者 chmod改變檔案的許可權 下圖我是新建了一個text.txt文件,然後ls顯示。看到了這個檔案所有者以及檔案所屬使用者組都是somnus,然後修改檔案所屬使用
Linux下檔案解壓縮、軟體安裝
1、linux常用解壓縮命令:.zip格式 解壓:unzip 檔名.zip 壓縮:zip 檔名.zip 目錄名 .tar格式 壓縮:tar cvf 檔名.tar 檔名
linux下檔案的大小到底多大
檔案的大小和實際佔用的空間,是倆回事兒,一般情況下,檔案大小 < 其佔用空間的大小, 即 ls -al file_name 小於 du -sk file_name 的大小 ,原因是:佔用空間取決於檔案系統的塊(block)的大小,linux一般預設是4k(4096) ,因此,一個大小為1個位元組的檔案,
linux下檔案比較工具diff|cmp使用小結
轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。 1.diff diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。 2.diff使用
linux 下檔案同步函式(fflush、sync、fsync、fdatasync)之間差異
遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。 Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該
Linux下檔案編碼格式轉換
常常在Linux中操作Windows下的檔案時,會遇到亂碼的情形。常見的比如在Visual Studio 中寫的C\C++程式需要放到Linux主機上編譯,而程式的中文註釋則顯示為亂碼,比較嚴重的是由於編碼原因,Linux上的編譯器報錯。 這是由於Windows中預設的檔案格式是GBK(gb2312),而L
解決linux下java程式碼獲取不到本機ip地址
今天在部署完預生產環境的時候發現一個問題,在linux下面java程式碼獲取本機ip地址獲取不到。但是我在測試環境上面是能夠獲取到的。先粘下獲取本機ip的程式碼: try{ Enumeration<NetworkInter
Linux下檔案和目錄操作命令大全
1、檢視目錄內容 ls 列表顯示目錄內容 萬用字元?單字元 含其一或段[a,b,c-d] *任意 ls -l長格式顯示檔案或目錄資訊 ls -a顯示所有包括隱藏的檔案或目錄 ls -h以K、M、G單位顯示檔案或目錄資訊 ls -d顯示目錄本身屬性資訊 2、建立目錄
linux下檔案在系統中的傳輸
1.scp scp file [email protected]:dir ##上傳(dir為絕對路徑) scp [email protected]:file dir ##下載(file為絕對路徑) 2.rs