文件和目錄

来源:https://www.cnblogs.com/songhe364826110/archive/2019/09/18/11546094.html
-Advertisement-
Play Games

[TOC] 1. 文件類型 Linux下一切皆文件,但文件也分為7種類型,文件類型信息包含在struct stat結構的st_mode成員中,可以用下表中的巨集來檢測文件類型,這些巨集的參數都是stat.st_mode。 | 文件類型 | 說 明 | 檢測文件類型的巨集 | | | | | 普通文件 | ...


目錄

1. 文件類型

Linux下一切皆文件,但文件也分為7種類型,文件類型信息包含在struct stat結構的st_mode成員中,可以用下表中的巨集來檢測文件類型,這些巨集的參數都是stat.st_mode。

文件類型 說 明
普通文件 最常用的文件類型,包含某種類型的數據,Linux不關心這些數據是文本還是二進位
目錄文件 包含目錄中其他文件的名字,以及與這些文件相關信息的指針
塊特殊文件 提供對設備帶緩衝的訪問,每次訪問長度固定
字元特殊文件 提供對設備不帶緩衝的訪問,每次訪問長度可變
FIFO 有名單向半雙工管道,用於進程間通信
套接字 socket,用於進程間網路通信
符號鏈接 文件本身只是個鏈接,指向另一個文件

struct stat是記錄文件信息的結構體,結構體定義如下所示,可以調用stat、fstat、lstat函數來獲取文件信息,其中ls -l命令就是基於stat實現的。

struct stat
{
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* file type & 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 */
};
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

//成功返回0,失敗返回-1
int stat(const char *path, struct stat *buf);   //通過路徑名pathname獲取
int fstat(int fd, struct stat *buf);            //通過文件描述符fd獲取
int lstat(const char *path, struct stat *buf);  //和stat唯一區別在於返回符號鏈接文件自身信息,而不是指向文件的信息

2. 文件訪問許可權

stat.st_mode也包含了對文件的訪問許可權位,每個文件有9個訪問許可權位,可將它們分成3類,如下表所示,其中前3行中,術語用戶指的是文件所有者(owner)。

st_mode mask 含 義
S_IRUSR
S_IWUSR
S_IXUSR
user-read
user-write
user-execute
S_IRGRP
S_IWGRP
S_IXGRP
group-read
group-write
group-execute
S_IROTH
S_IWOTH
S_IXOTH
other-read
other-write
other-execute

access函數

access函數可以測試對某個文件的訪問許可權。

#include <unistd.h>

//成功返回0,失敗返回-1
int access(const char *pathname, int mode);
  • 如果測試文件是否存在,mode就為F_OK,否則mode是由R_OK、W_OK、X_OK三個常值按位或組成的
  • R_OK、W_OK、X_OK分別測試對目標文件的讀、寫、可執行許可權

umask函數

umask函數為進程設置文件模式創建屏蔽字,並返回之前的值,該函數沒有出錯返回值。

#include <sys/types.h>
#include <sys/stat.h>

//返回之前的文件模式創建屏蔽字
mode_t umask(mode_t mask);
  • mask是由上面表格列出的9個st_mode mask常值按位或組成的
  • 設置完成後,由當前進程創建的新文件將關閉由mask指定的訪問許可權
  • umask函數只會影響當前進程

chmod函數

chmod函數可以改變已有文件的訪問許可權。

#include <sys/stat.h>

//參數mode即為新訪問許可權;成功返回0,失敗返回-1
int chmod(const char *path, mode_t mode);

3. 符號鏈接

符號鏈接是對一個文件的間接指針,也被稱為軟鏈接,它與硬鏈接有所不同,硬鏈接直接指向文件的i節點,引入符號鏈接的原因是為了避開硬鏈接的一些限制。

  • 硬鏈接通常要求鏈接和文件位於同一文件系統中,而符號鏈接無此限制
  • 只有root用戶才能創建指向目錄的硬鏈接,而符號鏈接任何用戶都可以創建

符號鏈接一般用於將一個文件或整個目錄結構移到系統中另一個位置。

4. 文件與目錄操作

刪除文件

創建文件可以調用open函數,刪除文件則需要調用unlink函數。

#include <unistd.h>

//成功返回0,失敗返回-1
int unlink(const char *pathname);

該函數將pathname引用文件的鏈接計數減1,若鏈接計數達到0,則刪除該文件。

創建目錄

mkdir函數用於創建一個新的空目錄,並自動創建.和..目錄項。

#include <sys/stat.h>
#include <sys/types.h>

//成功返回0,失敗返回-1
int mkdir(const char *pathname, mode_t mode);

mode指定目錄訪問許可權,通常至少需要設置一個執行許可權位,以允許訪問該目錄中的文件名。

刪除目錄

rmdir函數用於刪除一個空目錄,空目錄是只包含.和..的目錄。

#include <unistd.h>

//成功返回0,失敗返回-1
int rmdir(const char *pathname);

讀目錄

只要具有訪問許可權,任何用戶都可以讀目錄,但是只有內核才能寫目錄,寫許可權位和可執行許可權位只決定能否在該目錄中創建和刪除文件,並不代表能否寫目錄本身。

和讀文件一樣,讀目錄也包括三個函數:opendir、readdir、closedir。

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);     //成功返回指針,失敗返回NULL
struct dirent *readdir(DIR *dirp);  //成功返回指針,失敗返回NULL
int closedir(DIR *dirp);            //成功返回0,失敗返回-1

/* On Linux, the dirent structure is defined as follows: */
struct dirent
{
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported by all file system types */
    char           d_name[256]; /* filename */
};

/* d_type value is defined as follows */
DT_BLK      This is a block device.
DT_CHR      This is a character device.
DT_DIR      This is a directory.
DT_FIFO     This is a named pipe (FIFO).
DT_LNK      This is a symbolic link.
DT_REG      This is a regular file.
DT_SOCK     This is a Unix domain socket.
DT_UNKNOWN  The file type is unknown.

目錄操作示例代碼:遞歸遍歷目錄,列印所有文件路徑

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

void display_dir(char *dir_path)
{
    DIR *dir_ptr;
    int dir_len;
    struct dirent *file_info;
    char sub_dir[256];

    if (dir_path == NULL)
    {
        return;
    }

    dir_ptr = opendir(dir_path);
    dir_len = strlen(dir_path);

    if (dir_path[dir_len - 1] == '/')
    {
        dir_path[dir_len - 1] = '\0'; //統一輸出方式,避免出現dir//file.txt的現象
    }

    while (file_info = readdir(dir_ptr))
    {
        if (strcmp(file_info->d_name, ".") == 0 || strcmp(file_info->d_name, "..") == 0)
            continue;

        switch (file_info->d_type)
        {
        case DT_DIR:
            sprintf(sub_dir, "%s/%s", dir_path, file_info->d_name);
            display_dir(sub_dir);
            break;
        case DT_REG:
        case DT_BLK:
        case DT_CHR:
        case DT_FIFO:
        case DT_LNK:
            printf("%s/%s\n", dir_path, file_info->d_name);
            break;
        default:
            break;
        }
    }

    closedir(dir_ptr);
}

int main(int argc, char *argv[])
{
    display_dir(argv[1]);

    return 0;
}


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

-Advertisement-
Play Games
更多相關文章
  • 場景 FastReport安裝包下載、安裝、去除使用限制以及工具箱中添加控制項: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100893794 Winform中使用FastReport實現簡單的自定義PDF導出: https:/ ...
  • using System.Xml; //引入命名空間 //模擬介面返回的數據 string str=@"<JZD_Message xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XML ...
  • 屬性(Property)是類(class)、結構(structure)和介面(interface)的命名(named)成員。類或結構中的成員變數或方法稱為 域(Field)。屬性(Property)是域(Field)的擴展,且可使用相同的語法來訪問。它們使用 訪問器(accessors) 讓私有域的 ...
  • 場景 Winform中使用FastReport實現簡單的自定義PDF導出: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100920681 在上面已經實現自定義PDF並導出的基礎上,實現導出或者列印前的預覽。 實現 在窗體中拖拽 ...
  • 下拉刷新: html: js: 無限滾動: html: js: 解釋: 如有問題,歡迎留言 ...
  • 目錄導航 一、安裝 二、配置 三、調用 四、錯誤記錄 一、安裝 新建一個沒有身份驗證的mvc項目 - SwaggerMvc5Demo,然後添加一個名為Remote(自定義)且包含基礎讀寫(不想手寫)的ApiController 開源地址:https://github.com/domaindriven ...
  • 前言 不多BB,直接上圖 Linux命令行的組成結構 Linux系統命令操作語法格式 | 命令 | 空格 | 參數 | 空格 | 【文件或路徑】需要處理的內容 | | | | | | | | rm | | rf | | /tmp/ | | ls | | la | | /home | | 結婚 | | ...
  • [TOC] 由Linux內核提供的基本時間是自1970 01 01 00:00:00 +0000 (UTC)這一特定時間以來經過的秒數,這種描述是以數據類型time_t表示的,我們稱其為日曆時間。 獲得日曆時間的函數有3個:time、clock_gettime和gettimeofday。 time函 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...