読者です 読者をやめる 読者になる 読者になる

Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

C/C++でファイル一覧を再帰的に取得する方法

スポンサードリンク

f:id:fa11enprince:20150731131732j:plain
C/C++でファイル一覧を指定したディレクトリから再帰的に取得するソースです。
WindowsとLinuxで共用できるように書いてます。

bool traverse(const char* filepath, const int maxdepth, int curdepth);

が今回のファイル一覧を再帰的に取得する処理です。
あとはごちゃごちゃ書いているのはおまけです。
なお、#ifdef _WIN32のほうがwindowsでコンパイルして動く部分で、
それ以外がLinux(CentOSとかCygwinとか)で動く部分です。
なるべくWindowsとLinuxでコードを似せて書いてます。
ソースコードの文字コード問題があって日本語を書くと、文字コード変換したりと
いろいろ厄介な問題があるので、私は英語が得意ではありませんがめちゃくちゃな
英語コメントになっていますがそこはご愛嬌ということでお願いします…。
とりあえずCygwin上でutf-8(でも英字だけだからasciiコードと解釈)書いてます。
VisualStudio上ではコピペしてコンパイルしたので、改行がLFになってるくらいで、
あとはたぶんSJISとして勝手にVisualStudioが解釈していると思います。
あとプログラム内の処理コードですが、
VisualStudioでいうマルチバイト文字セットを使用するでコンパイルしています。
ちなみに確かVisualStudio2005あたりから既定のコンパイルオプションがUnicodeでのコンパイルになっているはずなので設定を変えてやらなきゃいけません。
そうしないと、charの部分をwcharまたはTCHARまたはWindowsの呪文のような型のLPTSTRなどで宣言したりしないといけなく、サンプルの見た目上よくないと判断し、、、というかめんどくさくてcharを使うためにマルチバイトでコンパイルしています。

ちなみに簡単な仕様はタイムスタンプ(YYYYMMDD HHMMSS)+ファイル名(指定ディレクトリからのパス)
1行ずつずらずらずらっと出すものです。
ある時点とある時点のファイルの差分用とかに使うときに使いやすい形にしてあるので
なんだかヘンテコ出力ですが。

ソースコード


iostreamとかC++系のライブラリを使って書き直してみたいです。
速度的なことだったりいろいろ考えるとC系のほうがなんだかんだで使い勝手いいんですがね。