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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...