Linux 獲取檔案屬性 函式 stat, fstat, lstat 以及 stat 結構體
linux程式設計裡,有三個函式可以獲取 檔案的屬性(包含了檔案型別和檔案許可權等屬性)。
三個函式的原型如下:
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int filedes, struct stat *restrict buf);
int lstat(const char *restrict pathname, struct stat *resstrict buf);
在這三個函式中,都用到了stat 結構體, 這裡就介紹一下stat結構體。
struct stat
{
mode_t st_mode; //檔案訪問許可權,型別
ino_t st_ino; //索引節點號
dev_t st_dev; //檔案所在裝置的裝置號
dev_t st_rdev; //檔案inode所代表的裝置的裝置號。
nlink_t st_nlink; //硬連結數
uid_t st_uid; //檔案所有者 使用者ID
gid_t st_gid; //檔案所在組 組ID
off_t st_size; //普通檔案,檔案大小, Bytes
time_t st_atime; //檔案被最後訪問(access)的時間
time_t st_mtime; //檔案內容最後被修改(modify)的時間
time_t st_ctime; //檔案狀態最後被修改的時間( status change)
blksize_t st_blksize; //檔案所在磁碟的磁碟塊大小
blkcnt_t st_blocks; //檔案佔用塊數量
};
通過一下的帶參巨集定義我們可以通過 st_mode引數判斷出檔案的型別:
S_ISREG(m) : 是否是普通檔案。
S_ISDIR(m) : 是否是目錄
S_ISCHR(m) : 是否是字元裝置
S_ISBLK(m) : 是否是塊裝置
S_ISFIFO(m) : 是否是FIFO(命名管道?)
S_ISLNK(m) : 是否是連結
S_ISSOCK(m) : 是否是socket
另外對於檔案的讀寫屬性也有如下的巨集定義:
S_IRUSR :所有者-讀
S_IWUSR :所有者-寫
S_IXUSR :所有者-執行
S_IRGRP : 組-讀
S_IWGRP : 組-寫
S_IXGRP :組-執行
S_IROTH :其他-讀
S_IWOTH :其他-寫
S_IXOTH :其他-執行
講完了,stat函式 中最重要的出參 struct stat, 接下來就講下 函式的返回值
函式返回值:
成功執行返回為0, 如果失敗則返回-1, 並且置errno。
errno型別:
EACCES: 搜尋許可權被拒絕。
EBADF : fd有誤
EFAULT : 地址有誤
ELOOP : 遍歷路徑時遇到太多的符號連線
ENAMETOOLONG : path 太長
ENOENT : 路徑path為空,或者路徑有誤。
ENOMEM : no memory
ENOTDIR : 路徑非法,其中路徑中有不是目錄的部分。
然後, stat, fstat, 和lstat 之間的區別是什麼呢?
通過函式原型,我們也可以知道一二。
對於stat,它可以僅僅通過檔案地址,獲取檔案屬性,而不一定要開啟檔案; 而fstat 需要將檔案開啟,獲取fd,然後通過fd來獲取檔案的stat。
對於連結檔案, stat獲取的檔案屬性是被連結檔案的檔案屬性,而lstat獲取的則是連結檔案本身的檔案屬性。
示例:(來自於http://linux.die.net/man/2/stat)
#include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct stat sb; if (argc != 2) { fprintf(stderr, "Usage: %s <pathname>\n", argv[0]); exit(EXIT_FAILURE); } if (stat(argv[1], &sb) == -1) { perror("stat"); exit(EXIT_FAILURE); } printf("File type: "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\n"); break; } printf("I-node number: %ld\n", (long) sb.st_ino); printf("Mode: %lo (octal)\n", (unsigned long) sb.st_mode); printf("Link count: %ld\n", (long) sb.st_nlink); printf("Ownership: UID=%ld GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid); printf("Preferred I/O block size: %ld bytes\n", (long) sb.st_blksize); printf("File size: %lld bytes\n", (long long) sb.st_size); printf("Blocks allocated: %lld\n", (long long) sb.st_blocks); printf("Last status change: %s", ctime(&sb.st_ctime)); printf("Last file access: %s", ctime(&sb.st_atime)); printf("Last file modification: %s", ctime(&sb.st_mtime)); exit(EXIT_SUCCESS); }
上述示例中的, S_IF* (S_IFBLK, ....)可以通過 sb.st_mode & S_IFMT 來獲取,也可以通過 上邊介紹的那些巨集定義S_ISREG(m)來獲取。
在我現在嘗試寫的一個webserver 小程式裡,就需要通過 stat 來判斷 檔案是否存在, 檔案是否可以執行。
inline int IsExecutable(mode_t mode)
{
return (mode & S_IXOTH );
}.
本文有部分內容來自於:http://linux.die.net/man/2/stat。
相關推薦
Linux 獲取檔案屬性 函式 stat, fstat, lstat 以及 stat 結構體
linux程式設計裡,有三個函式可以獲取 檔案的屬性(包含了檔案型別和檔案許可權等屬性)。 三個函式的原型如下: #include <sys/stat.h> int stat(const char *restrict pathname, struct sta
Linux獲取檔案屬性stat()、fstat()、lstat()函式例項學習
/* file stat example */ #include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #includ
【Linux學習筆記】獲取檔案屬性 — stat()、fstat()、lstat()小結
相關文章 Linux是基於檔案的作業系統,一切皆檔案。下面就詳細的整理一下關於Linux檔案屬性的內容。 一、檔案屬性函式 系統提供了3個獲取檔案屬性的函式,分別是:stat()、fstat()、lstat()。 1、函式原型 標頭檔案包含:
linux系統呼叫函式 lstat--獲取檔案屬性
所需標頭檔案: #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> 函式功能:用來獲取linux作業系統下檔案的屬性。 函式原型: int st
獲取檔案屬性—stat、lstat、fstat
一、函式原型 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>
檔案屬性函式stat/fstat/lstat
stat,lstat,fstat1 函式都是獲取檔案(普通檔案,目錄,管道,socket,字元,塊()的屬性。函式原型#include <sys/stat.h>int stat(const char *restrict pathname, struct stat
嵌入式Linux標準IO,獲取檔案大小fgetc(),定位流獲取檔案大小fteel()、rewind()/fseek(),處理錯誤資訊perror()/strerror()
#include <stdio.h> #include <errno.h> #include <string.h> int get_file_size(const char *file); int main(int argc, const char *a
Linux下檔案屬性的獲取
1. 資料結構和系統呼叫 在Linux下進行C/C++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。 標頭檔案“#include <sys/stat.h>” (1) //通過檔名稱獲取檔案屬性 int sta
Linux 修改檔案屬性,檔案使用者組,所有者
修改檔案屬性許可權1.利用數字型別修改許可權chmod [-R] xyz filename|dirname -R:表示遞迴修改Linux檔案的基本許可權有9個,分別是owner,group,others三種身份各自的read,write,execute許可權,3個一組.可以
js獲取物件屬性的兩種方法,object.屬性名,[‘屬性名’ ]
1、通過點的方式 2、通過括號的方式 例: <input type="text" value="hello" id="text"/> var oText = document.getElementById("text") (1)通過點的方式 oText.pr
Linux修改檔案屬性以及許可權
原文連結:Linux修改檔案屬性以及許可權 chgrp:改變檔案所屬使用者組 chown:改變檔案所有者 chmod改變檔案的許可權 下圖我是新建了一個text.txt文件,然後ls顯示。看到了這個檔案所有者以及檔案所屬使用者組都是somnus,然後修改檔案所屬使用
linux 下檔案同步函式(fflush、sync、fsync、fdatasync)之間差異
遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。 Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該
linux的檔案屬性與目錄配置
三個重要檔案: /etc/passwd 系統上的賬號與一般身份使用者,還有那個 root 的相關資訊/etc/shadow 密碼/etc/group &nbs
Python3 獲取檔案屬性(時間、大小等)
%y 兩位數的年份表示(00-99) %Y 四位數的年份表示(000-9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a本地簡化星期名稱 %A 本地完整星期名
使用ShellClass獲取檔案屬性詳細資訊
首先引用COM元件 Microsoft Shell Controls And Automation 這裡需要注意 DLL的屬性Embed Interop Type 設為False 否則會引起互操作型別異常
linux系統呼叫open、write、close、read以及stat函式詳解
學習筆記 參考連結1 、參考連結2以及百度百科 在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系
linux的檔案屬性
檔案屬性 67603664 -rw-r--r-- 1 root root 225 Dec 4 14:56 test.log inode 檔案型別 許可權 硬連結數 屬主 屬組 檔案大小 檔案修改時間&nbs
linux獲取檔案大小
摘自: http://os.51cto.com/art/200912/168700.html 在我們學習生活中經常會遇到問題和困難,就比如說我們在學習Linux時,比如怎樣Linux獲取檔案大小的方法。前幾天在工作中需要寫一段程式碼,獲取一些視訊檔案的大小,心想:這還不
Linux獲取檔案資訊
參考手冊:http://man7.org/linux/man-pages/man2/stat.2.html 基本使用方式: int stat(const char *pathname, struct stat *statbuf); int lstat(const char *pa
Linux修改檔案屬性及許可權
修改檔案使用者組: (組名必須在/etc/group檔案中) chgrp [-R] grpname filename|dirname -R:將目錄內檔案的所屬組都改為指定組名 eg: 修