(57)【要約】【課題】ディレクトリ階層の深さに関係なく，一定のメモリ消費量にてディレクトリを走査することができるプログラムを提供する。【解決手段】コンピュータに，（１）以下の（２）と（３）を実行するためのメモリをコンピュータ上に確保する手段と，（２）カレントディレクトリ内のファイルおよびディレクトリを検出する手段と，（３）検出したファイルおよびディレクトリの情報を書き出す手段と，（４）カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，（１）で確保したメモリを解放する手段と，書き出した情報にディレクトリの情報が存在し，かつフラグが設定されていないディレクトリに対し，（１）から（４）を実行させる手段，として機能させるプログラム。【選択図】図２
2012216111.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに，
（１）以下の（２）と（３）を実行するためのメモリを前記コンピュータ上に確保する手段と，
（２）カレントディレクトリ内のファイルおよびディレクトリを検出する手段と，
（３）検出したファイルおよびディレクトリの情報を書き出す手段と，
（４）前記（２）および（３）に記載の手段により，前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，前記（１）で確保したメモリを解放する手段と，
前記書き出した情報にディレクトリの情報が存在し，かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして，前記（１）から（４）を実行させる手段，
として機能させるプログラム。
【請求項２】
（１）以下の（２）と（３）を実行するためのメモリを前記コンピュータ上に確保する手段と，
（２）カレントディレクトリ内のファイルおよびディレクトリを検出する手段と，
（３）検出したファイルおよびディレクトリの情報を書き出す手段と，
（４）前記（２）および（３）に記載の手段により，前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，前記（１）で確保したメモリを解放する手段と，
前記書き出した情報にディレクトリの情報が存在し，かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして，前記（１）から（４）を実行させる手段と，
を備えるディレクトリ走査装置。
【請求項３】
コンピュータが使用するメモリ消費量を低減する方法であって，
（１）以下の（２）と（３）を実行するためのメモリを前記コンピュータ上に確保するステップと，
（２）カレントディレクトリ内のファイルおよびディレクトリを検出するステップと，
（３）検出したファイルおよびディレクトリの情報を書き出すステップと，
（４）前記（２）および（３）のステップにより，前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，前記（１）で確保したメモリを解放するステップと，
前記書き出した情報にディレクトリの情報が存在し，かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして，前記（１）から（４）を実行させるステップと，
を含む方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本願発明は，コンピュータの記憶装置におけるディレクトリ構造の走査プログラムおよびディレクトリ操作装置に関する。
【背景技術】
【０００２】
主要なコンピュータコンポーネンツの１つであるＨＤＤ（ハードディスクドライブ）などの記憶装置は，記憶データであるファイルをディレクトリと呼ばれる階層構造にて管理している。ディレクトリとは論理的な箱であり，この中には，ファイルだけでなく更なるディレクトリを入れることもできる。たとえば，最も上位の階層はルートディレクトリ（ｒｏｏｔ）と呼ばれ，その中に任意の名称のディレクトリやファイルを配置することができる。このため，ディレクトリを使えば，いくつもの階層のディレクトリを作ることができ，多くのファイルを用途ごとに分類するなど，データを効率的に管理することができる。
【０００３】
実際にコンピュータが記憶装置を管理するには，まずは，コンピュータが前述したディレクトリを走査し，すべてのディレクトリおよびファイルのリストを作成する必要がある。具体的には，コンピュータは，ルートディレクトリを開始地点としてすべてのディレクトリを走査し，ディレクトリやファイルをリストアップしていく。ルートディレクトリの走査でディレクトリが見つかれば，さらにそのディレクトリ内を走査するという動作を繰り返し行い，ディレクトリがなくなった時点で最初に見つかったディレクトリの走査が完了となる。勿論，ルートディレクトリに他のディレクトリがあれば，これも同様に走査を行う。このようなリストアップの手法は，再帰呼び出し処理と呼ばれ，ディレクトリとファイルのリストアッププログラムでは，ごく一般的かつ定石的に用いられている。勿論，様々な技術文献においても開示されており，その一例が非特許文献１である。
【先行技術文献】
【特許文献】
【０００４】
【非特許文献１】アイティメディア株式会社  ホームページ＜URL : http://www.atmarkit.co.jp/fcoding/articles/algorithm/03/algorithm03a.html＞
【０００５】
ところで，近年は，ＰＣやワークステーションなど，いわゆるパソコンと呼ばれる形態のコンピュータだけでなく，携帯音楽プレーヤ，テレビ録画装置および携帯電話など，さまざまな電子機器においても記憶装置が利用され始めている。こういった機器の多くは，コンピュータの一種である組み込み機器と呼ばれるものであり，各々予め限定された処理のみを実行するものであって，汎用的な処理を行う前述のパソコンと異なり，必要最低限のハードウェアリソースしか備えていないものが多い。このため，記憶装置の利用に関して，ハードウェアリソースが潤沢なパソコンなどでは生じなかった技術的課題が生じつつある。
［ディレクトリ構造の全体図］
【０００６】
図１は，本願発明および従来技術（再帰呼び出し処理）の説明にて使用するディレクトリ構造の全体図である。なお，このディレクトリ構造は例示であって，本願発明はこれに限定されることなく，どのようなものにも適用可能である。
【０００７】
ｒｏｏｔは，コンピュータの記憶装置における最上位ディレクトリであり，ここを頂点としてディレクトリやファイルが配置される。ｒｏｏｔ以下，図では，ディレクトリＤ１，Ｄ２およびＤ３が存在し，たとえば，ディレクトリＤ１の中にはディレクトリＤ２およびファイルＦ１が存在する。同様に，ディレクトリＤ３の中にはファイルＦ２およびファイルＦ３が存在する。
【０００８】
図２は，図１に示すディレクトリ構造を，再帰呼び出し処理を利用して走査するプログラム構造である。図では，処理が進むにつれて，メモリ消費量を意味するスタックサイズが増加する様子を示している。特徴は，プログラム開始を意味するファイルオープンから，終了のファイルクローズまでの間，一時的とはいえ，大きなスタックサイズが必要となることである。動作の詳細は後述するフローで説明するが，このようになる理由は，再帰呼び出し処理において，ディレクトリが検出されるたびにそのディレクトリを走査し，ディレクトリが存在しない最下層に到達するまで，プログラムを終了せず同じ走査処理を繰り返すためである。このようにディレクトリ走査処理内で何度も同じ処理（自身のプログラム）を呼び出すことから，再帰呼び出し処理と呼ばれる。
［再帰呼び出し処理の動作フロー］
【０００９】
図３は，図１のディレクトリ構造を再帰呼び出し処理にて走査する場合のプログラムの再帰実行回数を示したものである。図に示す通り，ディレクトリを検出するたび，さらにそのディレクトリを走査し，最終的にディレクトリを検出しなくなるまで走査している。図ではファイルＦ２，Ｆ３を検出するまで走査処理を繰り返し，ディレクトリＤ１まで戻った後，最後にファイルＦ１を書き出して完了となる。ファイルＦ１を書き出す際は，再帰的にプログラムが呼び出されるわけではないので，合計４回プログラムが再帰的に呼び出されたこととなる。
【００１０】
図４は，再帰呼び出し処理によるディレクトリ走査プログラムの動作フローである。ステップＳ４０１は，プログラムの開始を意味するファイルオープンであり，一方，プログラムの終了はステップＳ４０３のファイルクローズである。その間に位置するステップＳ４０２のリストアップが，再帰呼び出し処理の中心部である。図に記載の通り，リストアップ処理は，呼び出されるたびにスタックが確保（消費）される。
【００１１】
ステップＳ４０２のリストアップの具体的処理は，ステップＳ４１１〜Ｓ４１５である。ステップＳ４１１にて，現在のディレクトリであるカレントディレクトリ内の要素の検出が完了したかどうかを判断する。要素とは，ディレクトリおよびファイルのことである。判断の結果，完了していればステップＳ４１５に進み，そうでなければステップＳ４１２に進む。
【００１２】
ステップＳ４１２にて，検出された要素のファイルへの書き出しを行う。ステップＳ４１３にて，書き出した要素がディレクトリであるかどうかを判断し，そうであればステップＳ４１４に進み，再度リストアップを行い，そうでなければ，つまり要素がファイルであれば，ステップＳ４１１に戻る。このようにディレクトリが検出されるたびにリストアップを繰り返すわけであるが，そのたびにスタックが累積的に確保される。  
【００１３】
上述したようにステップＳ４１１で，カレントディレクトリ内の要素検出が完了したと判断すれば，ステップＳ４１５にてリストアップのプログラムは終了し，ステップＳ４０３に進む。この時点ではじめて確保されたスタックは解放される。
【００１４】
このようにしてディレクトリを走査するのであるが，リストアップの処理は，すべてのディレクトリを走査するまで完了しないことから，新たなディレクトリが検出され，ステップＳ４１４の処理が呼び出されるたびに累積的にスタックを確保し続けることとなる。確保されたスタックが解放されるタイミングは，ステップＳ４１５にてリストアッププログラムがリターンするときのみであるため，ディレクトリの階層が深いほど，つまり，リストアッププログラムが再帰的に呼び出される回数が多いほど，スタックサイズが増大するわけである。
【００１５】
再帰的呼び出し処理の回数とスタックとの関係を示したのが図５である。ディレクトリが検出されリストアップ処理が呼び出されるたびにスタックサイズが１つ大きくなり，この図では４つのスタックサイズとなっている。最下層のディレクトリに到達すると，順に上位層に戻っていくのであるが，その際は，スタックが１ずつ減少していく。図示していないが，その過程で別のディレクトリがあれば，再度リストアップ処理を行うためスタックが増加する。
【００１６】
このように，必要となるスタックサイズは，ディレクトリ階層の最大値に依存しているが，これは，事前に把握することができるものではないため，ディレクトリの走査は，パソコンほどハードウェアリソースが潤沢でない組み込み機器にとっては，スタックオーバフローのおそれを伴う危険な処理であるという問題があった。
【発明の概要】
【発明が解決しようとする課題】
【００１７】
上述した課題に鑑み，本願発明では，ディレクトリ階層の深さに関係なく，一定のメモリ消費量にてディレクトリを走査することができるプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１８】
本願発明にかかる第１の形態は，コンピュータに，（１）以下の（２）と（３）を実行するためのメモリをコンピュータ上に確保する手段と，（２）カレントディレクトリ内のファイルおよびディレクトリを検出する手段と，（３）検出したファイルおよびディレクトリの情報を書き出す手段と，  （４）（２）および（３）に記載の手段により，カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，（１）で確保したメモリを解放する手段と，書き出した情報にディレクトリの情報が存在し，かつフラグが設定されていないディレクトリをカレントディレクトリとして，（１）から（４）を実行させる手段，として機能させるプログラムである。
【００１９】
本願発明にかかる第２の形態は，（１）以下の（２）と（３）を実行するためのメモリをコンピュータ上に確保する手段と，（２）カレントディレクトリ内のファイルおよびディレクトリを検出する手段と，（３）検出したファイルおよびディレクトリの情報を書き出す手段と，（４）（２）および（３）に記載の手段により，カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，（１）で確保したメモリを解放する手段と，書き出した情報にディレクトリの情報が存在し，かつフラグが設定されていないディレクトリをカレントディレクトリとして，（１）から（４）を実行させる手段と，を備えるディレクトリ走査装置である。
【００２０】
本願発明にかかる第３の形態は，コンピュータが使用するメモリ消費量を低減する方法であって，  （１）以下の（２）と（３）を実行するためのメモリをコンピュータ上に確保するステップと，  （２）カレントディレクトリ内のファイルおよびディレクトリを検出するステップと，（３）検出したファイルおよびディレクトリの情報を書き出すステップと，（４）（２）および（３）のステップにより，カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると，カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに，（１）で確保したメモリを解放するステップと，書き出した情報にディレクトリの情報が存在し，かつフラグが設定されていないディレクトリをカレントディレクトリとして，（１）から（４）を実行させるステップと，を含む方法である。
【発明の効果】
【００２１】
本願発明によれば，ディレクトリ走査に関して，プログラムを再帰的に呼び出すことがないので，ディレクトリ階層の深さに関わらず，メモリ消費量を一定に保ちつつ走査を行うことができる。
【発明を実施するための形態】
【００２２】
以下では図面を参照し本願発明に係る実施例を説明する。
［実施例］
［本願発明のプログラム構造］
【００２３】
図６は本願発明におけるディレクトリ走査のプログラム構造である。なお，対象となるディレクトリ構造は従来技術の説明で用いた図１の通りとする。従来技術である再帰呼び出し処理との大きな違いは，走査処理を進めても，スタックサイズが一定であることである。リストアップしては書き出すという，一見同様の処理を行っているようにも見えるが，このような異なる結果となる要因について以下で説明する。なお，再帰呼び出し処理も本願発明の処理も，ディレクトリ走査という動作の結果得られる成果（ディレクトリおよびファイル情報）については全く同じであり，その手順が異なるだけである。
【００２４】
図７は，図１のディレクトリ構造を本願発明の処理にて走査した場合のプログラムの実行回数を示したものである。大きな特徴は，ディレクトリの走査を進めても，プログラムが再帰的に呼び出されておらず，ディレクトリを走査するごとにいったんプログラムを完了（スタック解放）していることである。たとえばディレクトリＤ１の中を走査する場合，ディレクトリＤ２とファイルＦ１を検出し，書き出した時点でリストアップを完了し，書き出した情報の中にディレクトリ（この場合ディレクトリＤ２）があれば，そのディレクトリについて走査を行う。最終的に，ディレクトリがなくなりファイルだけになれば走査は完了となる。図では，ファイルＦ２とＦ３を書き出した時点で完了となる。
【００２５】
図３に示す再帰呼び出し処理では，ディレクトリが検出されるたびに，再帰的にリストアップを繰り返す処理となっているため，本願発明のようにリストアッププログラムをいったん完了することなく，プログラムが再帰的に呼び出されている。既に説明したように，プログラムが再帰的に呼び出されるということは，その間，スタックサイズは累積的に増加していることを意味している。
［本願発明による動作フロー］
【００２６】
図８は，本願発明によるディレクトリ走査プログラムの動作フローである。ステップＳ８０１にてファイルをオープンしプログラムを開始する。ステップＳ８０２にてリストアッププログラムを呼び出す。この時点でスタックが確保される。ステップＳ８１１にて，カレントディレクトリ内の要素検出が完了したかどうかを判断する。この結果，完了していればステップＳ８１３に進み，カレントディレクトリがチェック済みである旨を示すフラグを設定し，ステップＳ８１４にてリストアッププログラムは完了する。この時点で，確保されたスタックは解放される。一方，判断の結果，要素検出が完了していなければ，ステップＳ８１２に進み要素検出を繰り返す。
【００２７】
ステップＳ８０３にて，書き出したファイルにフラグの設定されていないディレクトリがあるかどうかを判断する。判断の結果，あればＳ８０２にて再度リストアップを行い，なければＳ８０４にてファイルをクローズしてプログラムを終了する。
【００２８】
本願発明は，このようにしてディレクトリの階層ごとにリストアッププログラムを完了，すなわちスタックを解放するため，ディレクトリ階層の深さに関わらず，スタックサイズは常に一定を保ちつつ，ディレクトリ走査を行うことができる。スタックサイズを常に一定に保つことができる理由は，ステップＳ７０２のリストアップ処理が再帰的に呼び出されることがないためであり，常に１回分の処理に必要なスタックしか消費しないからである。
【００２９】
図９は，ディレクトリ走査を行う場合の，再帰呼び出し処理と本願発明とのスタックサイズを比較したグラフである。再帰呼び出し処理は，ディレクトリ階層が多くなるごとに，累積的にスタックサイズが大きくなるが，本願発明は常に一定となることがわかる。
［まとめ］
【００３０】
本願発明によれば，ディレクトリ走査に関して，プログラムを再帰的に呼び出すことがないので，ディレクトリ階層の深さに関わらず，メモリ消費量を一定に保ちつつ走査を行うことができる。
【図面の簡単な説明】
【００３１】
【図１】ディレクトリ構造の全体図
【図２】再帰呼び出しに処理によるディレクトリ走査プログラム構造
【図３】再帰呼び出し処理による再帰プログラムの実行回数
【図４】再帰呼び出しに処理によるディレクトリ走査プログラムの動作フロー
【図５】再帰的呼び出し処理の回数とスタックとの関係
【図６】本願発明のディレクトリ走査プログラム構造
【図７】本願発明によるプログラムの実行回数
【図８】本願発明によるディレクトリ走査プログラムの動作フロー
【図９】再帰呼び出し処理と本願発明のスタックサイズ
【符号の説明】
【００３２】
Ｓ７０３  未チェックのディレクトリチェック
Ｓ７１１  ディレクトリ内の要素検出完了チェック
Ｓ７１２  要素の書き出し
Ｓ７１３  チェック済みディレクトリのフラグ設定
【図１】
2012216111.tif 000003
【図２】
2012216111.tif 000004
【図３】
2012216111.tif 000005
【図４】
2012216111.tif 000006
【図５】
2012216111.tif 000007
【図６】
2012216111.tif 000008
【図７】
2012216111.tif 000009
【図８】
2012216111.tif 000010
【図９】
2012216111.tif 000011