Top > C/C++あれこれ > 階層のあるディレクトリを走査

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 
 
 
 
 
 
 
 
-
|
|
|
!
 
-
|
|
|
|
|
-
|
-
|
-
|
|
|
-
|
-
|
|
!
!
!
|
!
!
 
 
 
 
 
-
|
|
|
|
|
-
|
!
|
|
-
|
!
|
!
 
 
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <assert.h>
 
void my_walk( const char* dir, int depth );
const char* str_repeat(const char* str, int num);
 
int main(int argc, char** argv) {
 
    my_walk("/usr/local/share", 0);
    return 0;
}
 
void my_walk( const char* dir, int depth ) {
    
    DIR* handle = NULL;
    struct  dirent* lpDirent = NULL;
    char path[256];
    
    if( (handle = opendir(dir)) ) {
 
        while ( (lpDirent = readdir(handle)) ) {
 
            if( strcmp(lpDirent->d_name, ".") && strcmp(lpDirent->d_name, "..") ) {
 
                sprintf( path, "%s/%s", dir, lpDirent->d_name );
                
                if( lpDirent->d_type==DT_REG ) {
                    printf("%s%s\n", str_repeat("\t",depth), path);
                } else if( lpDirent->d_type==DT_DIR )  {
                    printf("%s%s/\n", str_repeat("\t",depth), path);
                    my_walk( path, depth + 1 );
                }
            }
        }
        closedir( handle );
    }
}
 
/*
 * PHPのstr_repeat的な関数。ただし、文字数・繰り返しに上限ありです。
 * また、スタティック変数を使用しているため非マルチスレッドセーフです。
 */
const char* str_repeat(const char* str, int num) {
    
    static char buf[256];
    memset( buf, 0, sizeof(buf) );
    
    assert(str);
    if( strlen(str)*num >= sizeof(buf) ) {
        return buf;
    }
    
    int i = 0;
    for( i=0; i<num; i++ ) {
        strcat(buf, str);
    }
    return buf;
}
 

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:25:11 (2923d)