【Linux】遍歷某一目錄,判斷檔案與資料夾,main引數
LINUX下遍歷目錄的核心標頭檔案是#include <dirent.h>,方法一般是這樣的:開啟目錄->讀取->關閉目錄。相關函式有:DIR *opendir(const char *dirname);struct dirent *readdir(DIR *dirp);int closedir(DIR *dirp);注意到,在讀取的時候,是返回一個叫dirent的結構體,其定義是這樣的:
struct dirent{ long d_ino; /* inode number */ off_t d_off; /* offset to this dirent */ unsigned short d_reclen; /* length of this d_name */ char d_name [NAME_MAX+1]; /* file name (null-terminated) */ }
結構體中d_ino存放的是該檔案的結點數目,什麼是結點數目呢,我也說不清楚了,呵呵,d_off是檔案在目錄中的編移,具體是什麼意思我也不是很明白,很少用,其本上就是用到:short d_reclen是這個檔案的長度,需要注意的是這裡的長度並不是指檔案大小,因為大小和長度是2回事了,你可以用lseek將檔案長度移得很長,但大小其實還是那麼大,不過一般情況下,可以視為相同。最後一個元素就是我們要的了,檔名稱!
而判斷一個檔案是檔案還是資料夾則用到#include <sys/stat.h>這個檔案,同樣有一個stat的結構體,struct stat這個結構體是用來描述一個linux系統檔案系統中的檔案屬性的結構。通過函式:int stat(const char *path, struct stat *struct_stat);將路徑與這個結構體連結起來,再判斷是否路徑。struct stat這個結構體具體如下:
struct stat{ mode_t st_mode; //檔案對應的模式,檔案,目錄等 ino_t st_ino; //inode節點號 dev_t st_dev; //裝置號碼 dev_t st_rdev; //特殊裝置號碼 nlink_t st_nlink; //檔案的連線數 uid_t st_uid; //檔案所有者 gid_t st_gid; //檔案所有者對應的組 off_t st_size; //普通檔案,對應的檔案位元組數 time_t st_atime; //檔案最後被訪問的時間 time_t st_mtime; //檔案內容最後被修改的時間 time_t st_ctime; //檔案狀態改變時間 blksize_t st_blksize; //檔案內容對應的塊大小 blkcnt_t st_blocks; //檔案內容對應的塊數量 };
那麼具體怎麼用呢?下面用一個例子說明問題,程式具體完成的功能如下:
有如下的一個資料夾:
使用者執行程式,第一個引數指定這個資料夾,就將這個資料夾遍歷出來,同時列印檔案長度,並且判斷這個資料夾是目錄還是檔案。
同時還要注意,使用者在路徑末端有/或者沒有/都是可以執行的:
具體的程式碼如下,其中用到除了上述的內容以外,還說明了main引數如何用,唯一需要強調一下char* argv[]這個字串輸入中,第0個位置argv[0]是程式名,也就是上面的./read_dic,第1個位置argv[1]才是使用者輸入的第一個引數,同時,還用到了《【Linux】純C環境下字串的處理》(點選開啟連結)的部分內容,這裡就不贅述了。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>//輸出檔案資訊
#include <sys/stat.h>//判斷是否目錄
#include <string.h>
int is_dir(char* path){//判斷是否是目錄
struct stat st;
stat(path,&st);
if(S_ISDIR(st.st_mode)){
return 1;
}
else{
return 0;
}
}
char* str_contact(const char* str1,const char* str2){//字串連線
char* result;
result=(char*)malloc(strlen(str1)+strlen(str2)+1);//str1的長度+str2的長度+\0;
if(!result){//如果記憶體動態分配失敗
printf("字串連線時,記憶體動態分配失敗\n");
exit(1);
}
strcat(result,str1);
strcat(result,str2);//字串拼接
return result;
}
int main(int argc,char *argv[]){//遍歷整個目錄
char* path=argv[1];//取使用者輸入的第一個引數
argv[1]=str_contact(argv[1],"/");//在後面補個/
DIR* dp;//用DIR指標指向這個資料夾
struct dirent* filename;
dp=opendir(path);
if(!dp){
printf("開啟資料夾失敗!\n");
return 0;
}
while(filename=readdir(dp)){//遍歷DIR指標指向的資料夾,也就是檔案陣列。
char* path=argv[1];
path=str_contact(path,filename->d_name);//取檔名與當前資料夾拼接成一個完整的路徑
if(is_dir(path)){
printf("%s\t%ld\t目錄\n",path,filename->d_ino);
}
else{
printf("%s\t%ld\t檔案\n",path,filename->d_ino);
}
}
closedir(dp);
return 0;
}
相關推薦
【Linux】遍歷某一目錄,判斷檔案與資料夾,main引數
LINUX下遍歷目錄的核心標頭檔案是#include <dirent.h>,方法一般是這樣的:開啟目錄->讀取->關閉目錄。相關函式有:DIR *opendir(const char *dirname);struct dirent *readdir(
【JS API】指令碼語言-裝置控制介面說明-判斷檔案或資料夾是否存在
裝置控制介面說明-判斷檔案或資料夾是否存在 doesExist 原型: doesExist(filePath) 是否支援多裝置: 不支援 描述: 判斷指定的檔案或資料夾是否存在。 引數: filePath: 手機上檔案或資料夾路徑 返回值: 整型:檔案或資
linux中ls命令:(顯示指定目錄裡的檔案及資料夾清單)
列出目錄下的所有檔案,包括以 . 開頭的隱含檔案。 -A,–almost-all 列出除了 . 及 .. 以外的任何專案 –author 印出每個檔案的作者 -b,–escape 把檔名中不可輸出的字元用反斜
eclipse中檔案目錄快速定位,開啟檔案所在資料夾,在資源管理器中檢視
viewFile.bat (開啟選中的檔案獲取資料夾) Explorer/e,/select,%1 viewjava.bat (開啟選中的檔名對應的.java檔案) @echo off set calssdir=%1 set package=%2 set pack
【前端】遍歷DOM
// parentNode var itemList = document.querySelector('#items'); console.log(itemList.parentNode); itemList.parentNode.style.backgroundColor = "#
【Java】 遍歷HashMap
1.遍歷鍵值對 使用map.entrySet(),注意foreach語句中的型別為Map.Entry<K, V> 2.遍歷Key 使用map.keySet() 3.遍歷Value 使用map.values() public static void m
【c++】遍歷字串的三種方式
就以:把字串“1234”轉換為整形1234,為例來說明遍歷字串的三種方式: ①常規方式(下標+operator[]) #include <iostream> #include <string> #include <vector> #include <
【JS】遍歷選擇jquery動態ID
面對多個功能相似,id相似的元素,如何一次為它們編碼? <button id='btn1'></button> <button id='btn2'></button> <button id='btn3'></butto
【C#】遍歷各類資料集合的方法
1、列舉型別 //遍歷列舉型別Sample的各個列舉名稱 foreach (string sp in Enum.GetNames(typeof(Sample)))
【VBA】遍歷資料夾及子資料夾
1. 需求 遍歷資料夾及子資料夾 2. 實現程式碼 Function recursiveFolder(strFolder) Dim fso, objFolder, objFiles,
【Angular2】遍歷巢狀實體生成陣列
前言 需要根據實體生成一個數組,存放初始資料 實體是ExamPaperModel(試卷),其中一個屬性為QuestionTypeList,包含的是實體QuestionTypeModel(題型),題型實體中有一個屬性為QuestionMainList,包含的是
mysql遍歷某一資料庫的某張表的所有欄位進行操作
寫了一個儲存過程,引數是輸入資料庫名稱和表名稱,然後對該表的所有欄位進行操作,過程如下: BEGIN #將表格中含有\N的值置為空 DECLARE table_column VARCHAR(64)
【Java】遍歷List/Set/Map集合的一些常用方法
/* * 遍歷List/Set/Map集合的一些常用方法 */import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List
【佇列】佇列 Queue(一):順序佇列與迴圈佇列
背景 沒什麼背景,就是想研究下佇列。 說明 什麼是佇列(Queue)? 佇列在生活中可謂是無處不在。最常見的就是去超市買菜稱重時大媽們排得賊長的佇列(這是理想情況,通常是圍成一圈),還有超市結賬的隊伍,還有以前食堂打飯的隊伍。是不是很有印象呢~~~ 那佇列有
【Eclipse】eclipse如何在User Libraries新增自己的庫資料夾目錄以及引入外部jar庫檔案
1、eclipse 版本資訊 Eclipse Java EE IDE for Web Developers. Version: Luna Release (4.4.0) Build id: 20140612-0600 2、具體方法 第一步:在eclipse選單欄選擇
【Linux】中預設文字編輯器 vim 的入門與進階
### Linux 基本操作 vim 篇 --- #### vim 簡介 ---- vim 是 Linux 上最基本的文字編輯工具,其地位像是 Windows 自帶的記事本工具,還要少數的 Linux 系統自帶 leafpad 編輯器,leafpad 的操作介面更像是 Win 的記事本,可以使用滑
【TensorFlow】Win7下使用Object Detection API 訓練自己的資料集,並視訊實時檢測
說明: 圖片:自己開的攝像頭,擷取的圖片。選擇了200張圖片。下面會有擷取的指令碼。 使用labelImg工具進行圖片進行標註。產生PascalVOC格式的XML檔案。【labelImg工具的安裝和使用教程】 機器環境: i5 CPU 4核 (訓練的時候,記憶體和cup都在95左右
【101】java多叉樹廣度優先搜尋演算法,搜尋檔案和資料夾
我用了多叉樹廣度優先搜尋,遍歷了檔案的樹形結構,然後用回撥方法判斷檔案或資料夾是否符合搜尋條件。把結果返回到一個集合中。 演示的例子分成三個檔案:FileFilter、SearchFileUtils和Main。下面逐個給出程式碼。 FileFilter:
【Git學習筆記】刪除檔案及資料夾,並push到遠端庫
本文講述如何把本地倉庫上的檔案或者資料夾刪除,並且將這些改動提交到遠端倉庫。 1、準備 建立一個檔案並提交到版本庫中: 現在我想把版本庫中的test.txt檔案刪除。 把這個檔案push到遠端倉庫orgin中。 執行:git push origin master 2、
【bat】常用命令,拷貝檔案或資料夾。
@echo off :: /? 檢視幫助 :: 全拷貝資料夾 :: xcopy /e/y/i/f input output :: 拷貝檔案 :: copy bb.png cc.png :: for 迴圈(for /引數 %變數 in (集) do 命令 :: 這裡寫