linux下文件和目錄

来源:http://www.cnblogs.com/wurenzhong/archive/2017/09/12/7507914.html
-Advertisement-
Play Games

(1)普通文件(regular file):這是最常用的文件類型,這種文件包含了某種形式的數據,文件內容的解釋由處理該文件的應用程式進行。 (2)目錄文件(directory file):這種文件包含了其他文件的 名字以及指向這些文件有關信息的指針。對一個目錄文件具有讀許可權的進程,都可以讀該目錄的內 ...


(1)普通文件(regular file):這是最常用的文件類型,這種文件包含了某種形式的數據,文件內容的解釋由處理該文件的應用程式進行。


(2)目錄文件(directory file):這種文件包含了其他文件的 名字以及指向這些文件有關信息的指針。對一個目錄文件具有讀許可權的進程,都可以讀該目錄的內容,但只有內核可以  直接寫目錄文件。


(3)塊特殊文件(block special file):這種類型的文件提供對設備(如磁碟)帶緩衝的訪問,每次訪問一固定長度為單位進行。


(4)字元特殊文件(character special file):這種類型的文件提供對設備不帶緩衝的訪問,每次訪問長度可變。系統中的所有設備,要麼是字元特殊文件,要麼是塊特殊文件。


(5)FIFO:這種文件用於進程間通信,也叫做有命名管道。


(6)套接字(socket):這種類型的文件用於進程間的網路通信。套接字也可用於一臺宿主機上進程間的非網路通信。


(7)符號連接(symbolic link):這種類型的文件指向另一個文件。

函數描述:
1、頭文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
2、函數原型:
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
3、參數:
a、path:文件名
b、buf:是一個(struct stat)的指針

下麵是struct stat結構體的詳細介紹:

 struct stat {
						   dev_t     st_dev;     /* ID of device containing file */
						   ino_t     st_ino;     /* inode number */
						   mode_t    st_mode;    /* protection */
						   nlink_t   st_nlink;   /* number of hard links */
						   uid_t     st_uid;     /* user ID of owner */
						   gid_t     st_gid;     /* group ID of owner */
						   dev_t     st_rdev;    /* device ID (if special file) */
						   off_t     st_size;    /* total size, in bytes */
						   blksize_t st_blksize; /* blocksize for file system I/O */
						   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
						   time_t    st_atime;   /* time of last access */
						   time_t    st_mtime;   /* time of last modification */
						   time_t    st_ctime;   /* time of last status change */
			            };

  

4、返回值:
成功:0
失敗:-1

總結:這裡stat和lstat有點區別的,lstat可以看到符號連接(symbokic link),而stat卻不可以,下麵我用代碼具體給出來區別的地方。

文件類型包括在stat結構的st_mode成員中,下麵是這7種文件類型的判斷方法:
    巨集                                  文件類型
S_ISREG(m)        普通文件(is it a regular file?)
S_ISDIR(m)          目錄文件(directory?)
S_ISCHR(m)        字元特殊文件(character device?)
S_ISBLK(m)         塊特殊文件(block device?)
S_ISFIFO(m)       管道或FIFO [FIFO (named pipe)?]
S_ISLNK(m)        符號鏈接 [symbolic link? (Not in POSIX.1-1996.)]
S_ISSOCK(m)     套接字 [socket? (Not in POSIX.1-1996.)]

判斷例子:

       struct stat fileinfo;
       stat("text.txt",&fileinfo); //text.txt為普通文件
       if(S_ISREG(fileinfo.st_mode))
       {
         printf("the file is regular file\n");
       }

 好了,說了這麼多,直接上代碼看看具體是怎麼判斷文件的類型的:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[])
{
    if(argc !=5 )
    {
        printf("argc must equal to 5!\n");
        exit(1);
    }     
    struct stat fileinfo;   
    int i;
    for(i=1;i<5;i++)
    {
        bzero(&fileinfo,sizeof(fileinfo));
        //stat(argv[i],&fileinfo); //這裡stat和lstat有點的區別,lstat可以產看到符號連接(symbokic link),而stat卻不可以
        lstat(argv[i],&fileinfo);
        if(S_ISREG(fileinfo.st_mode)) //普通文件
        {
            printf("%s file is regular file\n",argv[i]);
        }
        else if(S_ISDIR(fileinfo.st_mode)) //目錄
        {
            printf("%s file is directory file\n",argv[i]);
        }        
        else if(S_ISCHR(fileinfo.st_mode)) //字元特殊文件
        {
            printf("%s file is character device file\n",argv[i]);
        }
        else if(S_ISBLK(fileinfo.st_mode)) //塊特殊文件
        {
            printf("%s file is block device file\n",argv[i]);
        }
        else if(S_ISFIFO(fileinfo.st_mode)) //FIFO或管道
        {
            printf("%s file is FIFO\n",argv[i]);
        }        
        else if(S_ISLNK(fileinfo.st_mode))  //符號連接
        {
            printf("%s file is symbokic link\n",argv[1]);
        }        
        else if(S_ISSOCK(fileinfo.st_mode)) //套接字
        {
            printf("%s file is socket\n",argv[i]);
        }        
        else
        {
            printf(" %s not a file name\n",argv[i]);
        }
    }    
    return 0;
}

 lstat和stat的區別:

代碼中註釋掉://stat(argv[i],&fileinfo); 即是用到lstat函數時終端的輸出如下

代碼中註釋掉:lstat(argv[i],&fileinfo);即是用到stat函數終端的輸出如下


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 主要內容: 技術關鍵點:docker17.06.3安裝,docker自製鏡像及相關容器操作,docker分配固定IP及添加埠映射,solrCloud集群部署等 主要思路:在Ubuntu14.04操作系統的宿主機中,安裝docker17.06.3,將宿主機的操作系統製作成docker基礎鏡像,之後使 ...
  • 1.運行-regedit 打開註冊表 定位到 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Network {4D36E972-E325-11CE-BFC1-08002BE10318} 目錄下 這裡保存著當前網卡配置信息,查找目錄下每個子目錄... ...
  • Ubuntu16.04無法安裝libtool,只能在Ubuntu14.04以下版本安裝。 cp 下載/crosstool-ng-1.22.0.tar.bz2 /home/hou/ tar -xvf crosstool-ng-1.22.0.tar.bz2 cd crosstool-ng 安裝一些必要的... ...
  • 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 ...
  • 簡述:ActiveMQ是由Apache出品的,一款最流行的,能力強勁的開源消息匯流排。ActiveMQ是一個完全支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,它非常快速,支持多種語言的客戶端和協議,而且可以非常容易的嵌入到企業的應用環境中,並有許多高級功能。 安裝Active ...
  • 前言:轉載 陳浩一個從事安全運維向的前輩文章。寫的很好。人非常nice,遇到了問題,qq上很快就回覆了我。 大道三千 入門最難,凡事入了行,也就什麼都好說了,好的自然不斷努力奮鬥修行,不好的自然很快就被淘汰。恭謹勤勉,時不我待~ it自動化運維就是要很方便的運用各種工具進行管理維護,有效的實施伺服器 ...
  • 1.環境: ubuntu16.04 2.背景: 想更換下位機內核 3.使用kermit進行串口傳輸 舉例:傳輸文件到下位機 2.1首先進入下位機的uboot 2.2 使用uboot自帶的命令從串口接收數據 loadb 將接收到的數據放到記憶體的某個位置 比如: loadb 0x42000000 2.3 ...
  • 1.環境: Ubuntu 16.04 2.獲取 wget mirrors.ustc.edu.cn/gnu/gcc/gcc-4.8.3/gcc-4.8.3.tar.bz2 3.解壓 tar xvf gcc-4.8.3.tar.bz2 4.切換目錄 cd gcc-4.8.3 5.下載mpfr等依賴庫 . ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...