簡體   English   中英

C <sys/stat.h> 查找文件類型

[英]C <sys/stat.h> Find file type

我為項目創建了自己的ls命令,並使用“ st_mode”變量來查找文件許可權,但我不使用宏。

例如:st_mode = 16877

我將其轉換為八進制:

st_mode = 40755

我保留了最后三個字符,並獲得了我的許可。

但是,當我嘗試查找文件的類型時,我嘗試使用前兩個字符,但它們並沒有真正幫助我...所以我想知道是否可以使用前兩個字符來查找文件的類型(鏈接,文件夾...)。 如果不能,應該使用什么來查找文件的類型

謝謝你的幫助。

根據POSIX <sys / stat.h>文檔

應提供以下宏以測試文件是否為指定類型。 提供給宏的值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_modeS_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值為10664permission最后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM