1. 程式人生 > >【Linux】遍歷某一目錄,判斷檔案與資料夾,main引數

【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)

JavaList/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)? 佇列在生活中可謂是無處不在。最常見的就是去超市買菜稱重時大媽們排得賊長的佇列(這是理想情況,通常是圍成一圈),還有超市結賬的隊伍,還有以前食堂打飯的隊伍。是不是很有印象呢~~~ 那佇列有

Eclipseeclipse如何在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 的記事本,可以使用滑

TensorFlowWin7下使用Object Detection API 訓練自己的資料並視訊實時檢測

說明: 圖片:自己開的攝像頭,擷取的圖片。選擇了200張圖片。下面會有擷取的指令碼。 使用labelImg工具進行圖片進行標註。產生PascalVOC格式的XML檔案。【labelImg工具的安裝和使用教程】 機器環境: i5 CPU 4核  (訓練的時候,記憶體和cup都在95左右

101java多叉樹廣度優先搜尋演算法搜尋檔案資料

我用了多叉樹廣度優先搜尋,遍歷了檔案的樹形結構,然後用回撥方法判斷檔案或資料夾是否符合搜尋條件。把結果返回到一個集合中。 演示的例子分成三個檔案: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 命令 :: 這裡寫