[英]C <sys/stat.h> Find file type
我為項目創建了自己的ls命令,並使用“ st_mode”變量來查找文件許可權,但我不使用宏。
例如:st_mode = 16877
我將其轉換為八進制:
st_mode = 40755
我保留了最后三個字符,並獲得了我的許可。
但是,當我嘗試查找文件的類型時,我嘗試使用前兩個字符,但它們並沒有真正幫助我...所以我想知道是否可以使用前兩個字符來查找文件的類型(鏈接,文件夾...)。 如果不能,應該使用什么來查找文件的類型
謝謝你的幫助。
應提供以下宏以測試文件是否為指定類型。 提供給宏的值m是來自stat結構的st_mode的值。 如果測試為真,則宏應評估為非零值; 如果測試為假,則為0。
S_ISBLK(m) Test for a block special file. S_ISCHR(m) Test for a character special file. S_ISDIR(m) Test for a directory. S_ISFIFO(m) Test for a pipe or FIFO special file. S_ISREG(m) Test for a regular file. S_ISLNK(m) Test for a symbolic link. S_ISSOCK(m) Test for a socket.
是的,您可以將兩種方法與預定義的宏一起使用,如下所示,打開stat()系統調用的手冊頁,它說
S_IFMT 0170000 bit mask for the file type bit fields
因此, st_mode
和S_IFMT
&
會得到文件類型
struct stat v;
stat(file,&v);
switch (v.st_mode & S_IFMT) // type of file
{
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("unknown?"); break;
}
如果您不想使用宏,則首先找出每種files
類型的st_mode
值,然后編寫邏輯。 例如, regular file
st_mode
值為10664
, permission
最后3位數字(664),寫入二進制10664,您將知道15th
位被設置,因此st.mode >> 15
也是如此。 同樣,找到不同類型的文件和分析的st_mode值。
if( ( v.st_mode >> 15 & 1) && ( v.st_mode >> 14 & 1) )
printf("Socket File\n");
else if( ( v.st_mode >> 15 & 1) && ( v.st_mode >> 13 & 1) )
printf("Symbolic Link File\n");
else if( v.st_mode >> 15 & 1)
printf("Regular File\n");
else if((v.st_mode >> 14 & 1) && (v.st_mode >> 13 & 1) )
printf("Block Dev File\n");
else if(v.st_mode >> 14 & 1)
printf("Directory File\n");
else if(v.st_mode >> 13 & 1)
printf("Char Dev File\n");
else if(v.st_mode >> 12 & 1)
printf("FIFO/PIPE File\n");
希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.