1. 程式人生 > >Linux C 程式設計之遍歷子目錄及所有檔案

Linux C 程式設計之遍歷子目錄及所有檔案

轉載自:http://blog.csdn.net/jeff_nie/article/details/8464900

遍歷子目錄用的方法是遞迴呼叫,先判斷子目錄流指標所指向的檔案是否為目錄檔案。如果是,該函式將呼叫自身去遍歷子目錄;如果不是,則輸出檔名,繼續遍歷當前目錄,直到子目錄流指向NULL。函式的depth引數作用是在子目錄前增加空格的數量,每一輪遞迴都將增加4個空格,這樣更容易顯示目錄層次。

子目錄流操作相關函式:
DIR *OPENDIR(const char *name);    // 開啟路徑並建立子目錄流,返回子目錄流指標
struct dirent *readdir(DIR *dirp);          // 函式返回一個指標,指標指向的結構裡儲存著子目錄流dirp中下一個目錄資料項的有關資料。後續的readdir呼叫將返回後續的目錄資料。如果錯誤或達到了目錄尾,將返回NULL值
long int telldir(DIR *dirp);                      // 函式返回值裡記錄著子目錄流裡的當前位置
void seekdir(DIR *dirp, long int loc);    // 對dirp指定的子目錄流中的目錄資料項的指標進行設定。loc的值用來設定指標位置,它應該通過前一個telldir呼叫獲得
int closedir(DIR *dirp);                          // 關閉子目錄流,返回關閉操作結果

  1. #include <fcntl.h>             // 提供open()函式
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <dirent.h>            // 提供目錄流操作函式
  5. #include <string.h>
  6. #include <sys/stat.h>        // 提供屬性操作函式
  7. #include <sys/types.h>         // 提供mode_t 型別
  8. #include <stdlib.h>
  9. void
     scan_dir(char *dir, int depth)   // 定義目錄掃描函式
  10. {  
  11.     DIR *dp;                      // 定義子目錄流指標
  12.     struct dirent *entry;         // 定義dirent結構指標儲存後續目錄
  13.     struct stat statbuf;          // 定義statbuf結構儲存檔案屬性
  14.     if((dp = opendir(dir)) == NULL) // 開啟目錄,獲取子目錄流指標,判斷操作是否成功
  15.     {  
  16.         puts("can't open dir.");  
  17.         return;  
  18.     }  
  19.     chdir (dir);                     // 切換到當前目錄
  20.     while((entry = readdir(dp)) != NULL)  // 獲取下一級目錄資訊,如果未否則迴圈
  21.     {  
  22.         lstat(entry->d_name, &statbuf); // 獲取下一級成員屬性
  23.         if(S_IFDIR &statbuf.st_mode)    // 判斷下一級成員是否是目錄
  24.         {  
  25.             if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)  
  26.               continue;  
  27.             printf("%*s%s/\n", depth, "", entry->d_name);  // 輸出目錄名稱
  28.             scan_dir(entry->d_name, depth+4);              // 遞迴呼叫自身,掃描下一級目錄的內容
  29.         }  
  30.         else
  31.             printf("%*s%s\n", depth, "", entry->d_name);  // 輸出屬性不是目錄的成員
  32.     }  
  33.     chdir("..");                                                  // 回到上級目錄
  34.     closedir(dp);                                                 // 關閉子目錄流
  35. }  
  36. int main()  
  37. {  
  38.     puts("scan /home:");  
  39.     scan_dir("/home", 0);  
  40.     puts("scan over.");  
  41.     return 0;  
  42. }  

相關推薦

Linux C 程式設計子目錄所有檔案

轉載自:http://blog.csdn.net/jeff_nie/article/details/8464900 遍歷子目錄用的方法是遞迴呼叫,先判斷子目錄流指標所指向的檔案是否為目錄檔案。如果是,該函式將呼叫自身去遍歷子目錄;如果不是,則輸出檔名,繼續遍歷當前目錄

[Linux C]遞迴指定目錄下的子目錄檔案

/* 功能:演示了在Linux下利用C語言遞迴遍歷指定目錄下的子目錄(不含隱藏目錄)和檔案 */ #include <stdio.h> #include <dirent.h> #include <string.h> void List

linux網路程式設計TCP狀態轉換埠複用

(1)TCP狀態轉換圖               其中圖中分為三種狀態:實線代表的主動發起連線,虛線代表的被動發起連線,細實線代表的可以雙向發起連線的狀態。 主動發起連線方狀態變化:1)主動發起連線的一方傳送SYN標誌位,進入SYN_SENT狀態,等待接收被髮起連線方

Linux C程式設計IO-檔案拷貝

Linux C程式設計:IO 1.1檔案拷貝 本次檔案拷貝需要使用到如下三個函式原型: 開啟檔案 FILE * fopen(const char * path,const char * mode); 相關函式:open,fclose,fopen_

linux C語言資料夾所有檔案

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

學習Linux C程式設計語句

一、空語句 由分號“;”構成,作用:1.消耗cpu,起延時作用 2.使程式結構清楚,可讀性好 二、基礎語句 1.表示式+; 2.函式名+; 三、語句if     注意:1.不可將布林量直接與TRUE、FALSE或者1、0作比較,例如VC++將TRUE定義為1,而VB將TUR

C/C++:子目錄,列舉檔案,FindFirstFile + FindNextFile

  平時寫程式時經常會用到的遍歷子目錄列舉檔案的功能,用 Windows API 函式 FindFirstFile() 和 FindNextFile() 直接實現起來會相當繁瑣,有許多細節需要注意和記憶,要在短時間內寫出可以正常工作的、沒有BUG的、能夠遞迴遍歷多層子目錄並列

學習Linux C程式設計語句 問題-break和continue

break和continue都是用來控制迴圈結構的,主要是停止迴圈。 1.break 有時候我們想在某種條件出現的時候終止迴圈而不是等到迴圈條件為false才終止。 這是我們可以使用break來完成。 break用於完全結束一個迴圈,跳出迴圈體執行迴圈後面的語句。

linux c 程式設計前言

  linux c 程式設計之  前言    學linux也有兩年時間,不過一直以來都沒有很大的進步.閉門思過.究其因.沒老老實實學好程式設計.現在努力來補學!也以一個教程的方式來刺激自己,給自己壓力去學的深刻一點.在這個教程中.我都是以實際的應用來記錄自己學習linux c

學習Linux C程式設計程序控制程式設計

建立程序 fork fork 的定義 在 Linux 中,我們使用 fork 來建立一個子程序 fork 的返回值 fork 函式有些特殊,成功它返回 2 次,失敗返回 -1,利用這個特性可以判斷當前的程序是子程序還是父程序:  1. 在子程序中返回 0  2.

學習Linux C程式設計預處理與結構體

結構體的一般定義形式為:  struct 結構體名{     型別名1 成員名1;     型別名2 成員名2;     ……     型別名n 成員名n;    }; struct是關鍵字,是結構體型別的標誌。例如,定義一個Carstruct Car {    int wheels; // 輪子數    i

學習Linux C程式設計陣列與指標

1.    指標型別分析 分析指標,可以從變數名處起,根據運算子優先順序結合,一步一步分析. int p;  //這是一個普通的整型變數 int *p;  //首先從P處開始,先與*結合,所以說明P是一個指標,然後再與int結合,說明指標所指向的內容的型別為int 型.所以

php資料夾所有檔案

function listFiles($dir) { $files = array(); $handle = opendir($dir); while ($file = readdir($handle)) { if (

利用boost路徑下所有檔案,並判斷檔案是否是資料夾

#include<boost/filesystem.hpp> void GetFileNameFromDir(const char* rootPath) {     boost::filesystem::path dir(rootPath);     if (b

Android手機內所有檔案

通常使用遞迴的方式遍歷記憶體中的所有檔案 首先遍歷所有檔案的方法 //遍歷手機所有檔案 並將路徑名存入集合中 引數需要 路徑和集合 public void recursionFile(File di

Excel VBA 目錄下所有檔案

         Application.ScreenUpdating = False         Dim MyDir As String         MyDir = ThisWorkbo

python 目錄下所有檔案

#!/usr/bin/python # -*- coding: utf-8 -*- import os def gci(filepath): #遍歷filepath下所有檔案,包括子目錄 files = os.listdir(filepath) for fi in

Python遞迴目錄下所有檔案查詢指定檔案

之前看到網上有人說『os.path.isdir()判斷必須寫絕對路徑』,當時心想Python不是有迭代上下文嗎,為什麼不行?遂作本文驗證之 程式碼部分 考慮用一個path變數指代當前遍歷元素的絕對路徑(正確做法) def search(ro

PHP 目錄下面所有檔案(案例)

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style&g

Python 讀取指定目錄下的所有子目錄所有檔案

掃描指定目錄下的檔案,或者匹配指定字尾和字首的檔案。 如果要掃描指定目錄下的檔案,包括子目錄,呼叫scan_files("/export/home/test/") 如果要掃描指定目錄下的特定字尾的檔案(比如jar包),包括子目錄,呼叫scan_files("/export