meideru blog

meideruが書いているブログです。主に電子工作・プログラミング・ガジェット類などを中心に記事を書いています。

【Windows API】C言語でディレクトリ内を全て走査するプログラム

      2016/11/02

ちょっとわけあって、ディレクトリ内を走査するプログラムを書く必要がありました。

ネットなども駆使して色々と調べてみましたが、サンプルプログラムが見つかりませんでした(^_^;)

なので、自分で書いてみました(´・ω・`)

C言語でディレクトリ内を全て走査して表示するプログラムを作ってみました。ディレクトリ内の子ディレクトリのファイルも全て表示できます。

後でソースコードの解説は詳しくしますが、以下のプログラムではWin32 API を使っているので、Unix系では実行出来ません(´;ω;`)

ソースコード

GitHub

GitHubにもアップしているので、そちらからのクローンも可能です。

GitHub → https://github.com/meideru/WindowsAPI_SearchDirectory

ソースコード

このプログラムは、Cドライブ以下のディレクトリとファイルを全て表示します。

ソースコードを書き換えることによって、表示するディレクトリを変更できます。

使い方

表示するディレクトリを変更したいときは、18行目のパスを変更してください。

例えば、デスクトップ上のディレクトリとファイルを表示したいならば

(例)PrintDirsAndFiles(L“C:\\Users\\(ユーザーの名前)\\Desktop\\”);

みたいな感じで変更してください。

ソースコードの解説

Win32 API を使用しています

#include <windows.h>でわかるように、Win32 API を使用しています。

いろいろ調べて分かったことは、ディレクトリを走査するにはAPIを使用しなければならないようです。なので、Windowsでしか利用出来ません。

重要なのはFindFirstFileとFindNextFile関数

FindFirstFileで、任意のディレクトリ内のディレクトリまたはファイルを取得します。

FineNextFileは、FineFirstFileで取得したハンドルを引数として渡すと、任意のディレクトリ内の次のディレクトリまたはファイルを取得することができます。

これら2つの関数の詳しい使い方については、MSDNを参考にしてください(^o^)

再起を使っている

再起とは関数が自分で自分のことをもう一度呼び出すことです。本プログラムでは再起を用いています。

具体的には、ディレクトリを見つけたときに、そのディレクトリ内を探すために、ディレクトリを引数として渡して再起しています。

因みに、私は再起をあまり使ったことがないです^^; オセロのプログラムを作るときにミニマックス法を実現するために書いた程度です^^;

カレントディレクトリと親ディレクトリの発見に注意する

ディレクトリ内を走査していくと、「.」と「..」というディレクトリを発見することがあります。これは、それぞれカレントディレクトリと親ディレクトリのことです。

この2つのディレクトリ内は、探索しないようにしなくてはなりません。そのために、49行目で「何もしない」としています。

ワイド文字を使用している

FindFirstFileとFindNextFileの引数は全てワイド文字で表現されるようなので、最初からワイド文字前提でプログラムを書きました。

マルチバイト文字とワイド文字については、複雑で奥が深いので、いつか個別で記事を書きたいですね(^o^)

 

以上です。

何か間違いなどがありましたら、是非とも教えて下さい\(^o^)/

 

ノシ

 - プログラミング