説明

ディレクトリ走査プログラム

【課題】ディレクトリ階層の深さに関係なく,一定のメモリ消費量にてディレクトリを走査することができるプログラムを提供する。
【解決手段】コンピュータに,(1)以下の(2)と(3)を実行するためのメモリをコンピュータ上に確保する手段と,(2)カレントディレクトリ内のファイルおよびディレクトリを検出する手段と,(3)検出したファイルおよびディレクトリの情報を書き出す手段と,(4)カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,(1)で確保したメモリを解放する手段と,書き出した情報にディレクトリの情報が存在し,かつフラグが設定されていないディレクトリに対し,(1)から(4)を実行させる手段,として機能させるプログラム。

【発明の詳細な説明】
【技術分野】
【0001】
本願発明は,コンピュータの記憶装置におけるディレクトリ構造の走査プログラムおよびディレクトリ操作装置に関する。
【背景技術】
【0002】
主要なコンピュータコンポーネンツの1つであるHDD(ハードディスクドライブ)などの記憶装置は,記憶データであるファイルをディレクトリと呼ばれる階層構造にて管理している。ディレクトリとは論理的な箱であり,この中には,ファイルだけでなく更なるディレクトリを入れることもできる。たとえば,最も上位の階層はルートディレクトリ(root)と呼ばれ,その中に任意の名称のディレクトリやファイルを配置することができる。このため,ディレクトリを使えば,いくつもの階層のディレクトリを作ることができ,多くのファイルを用途ごとに分類するなど,データを効率的に管理することができる。
【0003】
実際にコンピュータが記憶装置を管理するには,まずは,コンピュータが前述したディレクトリを走査し,すべてのディレクトリおよびファイルのリストを作成する必要がある。具体的には,コンピュータは,ルートディレクトリを開始地点としてすべてのディレクトリを走査し,ディレクトリやファイルをリストアップしていく。ルートディレクトリの走査でディレクトリが見つかれば,さらにそのディレクトリ内を走査するという動作を繰り返し行い,ディレクトリがなくなった時点で最初に見つかったディレクトリの走査が完了となる。勿論,ルートディレクトリに他のディレクトリがあれば,これも同様に走査を行う。このようなリストアップの手法は,再帰呼び出し処理と呼ばれ,ディレクトリとファイルのリストアッププログラムでは,ごく一般的かつ定石的に用いられている。勿論,様々な技術文献においても開示されており,その一例が非特許文献1である。
【先行技術文献】
【特許文献】
【0004】
【非特許文献1】アイティメディア株式会社 ホームページ<URL : http://www.atmarkit.co.jp/fcoding/articles/algorithm/03/algorithm03a.html>
【0005】
ところで,近年は,PCやワークステーションなど,いわゆるパソコンと呼ばれる形態のコンピュータだけでなく,携帯音楽プレーヤ,テレビ録画装置および携帯電話など,さまざまな電子機器においても記憶装置が利用され始めている。こういった機器の多くは,コンピュータの一種である組み込み機器と呼ばれるものであり,各々予め限定された処理のみを実行するものであって,汎用的な処理を行う前述のパソコンと異なり,必要最低限のハードウェアリソースしか備えていないものが多い。このため,記憶装置の利用に関して,ハードウェアリソースが潤沢なパソコンなどでは生じなかった技術的課題が生じつつある。
[ディレクトリ構造の全体図]
【0006】
図1は,本願発明および従来技術(再帰呼び出し処理)の説明にて使用するディレクトリ構造の全体図である。なお,このディレクトリ構造は例示であって,本願発明はこれに限定されることなく,どのようなものにも適用可能である。
【0007】
rootは,コンピュータの記憶装置における最上位ディレクトリであり,ここを頂点としてディレクトリやファイルが配置される。root以下,図では,ディレクトリD1,D2およびD3が存在し,たとえば,ディレクトリD1の中にはディレクトリD2およびファイルF1が存在する。同様に,ディレクトリD3の中にはファイルF2およびファイルF3が存在する。
【0008】
図2は,図1に示すディレクトリ構造を,再帰呼び出し処理を利用して走査するプログラム構造である。図では,処理が進むにつれて,メモリ消費量を意味するスタックサイズが増加する様子を示している。特徴は,プログラム開始を意味するファイルオープンから,終了のファイルクローズまでの間,一時的とはいえ,大きなスタックサイズが必要となることである。動作の詳細は後述するフローで説明するが,このようになる理由は,再帰呼び出し処理において,ディレクトリが検出されるたびにそのディレクトリを走査し,ディレクトリが存在しない最下層に到達するまで,プログラムを終了せず同じ走査処理を繰り返すためである。このようにディレクトリ走査処理内で何度も同じ処理(自身のプログラム)を呼び出すことから,再帰呼び出し処理と呼ばれる。
[再帰呼び出し処理の動作フロー]
【0009】
図3は,図1のディレクトリ構造を再帰呼び出し処理にて走査する場合のプログラムの再帰実行回数を示したものである。図に示す通り,ディレクトリを検出するたび,さらにそのディレクトリを走査し,最終的にディレクトリを検出しなくなるまで走査している。図ではファイルF2,F3を検出するまで走査処理を繰り返し,ディレクトリD1まで戻った後,最後にファイルF1を書き出して完了となる。ファイルF1を書き出す際は,再帰的にプログラムが呼び出されるわけではないので,合計4回プログラムが再帰的に呼び出されたこととなる。
【0010】
図4は,再帰呼び出し処理によるディレクトリ走査プログラムの動作フローである。ステップS401は,プログラムの開始を意味するファイルオープンであり,一方,プログラムの終了はステップS403のファイルクローズである。その間に位置するステップS402のリストアップが,再帰呼び出し処理の中心部である。図に記載の通り,リストアップ処理は,呼び出されるたびにスタックが確保(消費)される。
【0011】
ステップS402のリストアップの具体的処理は,ステップS411〜S415である。ステップS411にて,現在のディレクトリであるカレントディレクトリ内の要素の検出が完了したかどうかを判断する。要素とは,ディレクトリおよびファイルのことである。判断の結果,完了していればステップS415に進み,そうでなければステップS412に進む。
【0012】
ステップS412にて,検出された要素のファイルへの書き出しを行う。ステップS413にて,書き出した要素がディレクトリであるかどうかを判断し,そうであればステップS414に進み,再度リストアップを行い,そうでなければ,つまり要素がファイルであれば,ステップS411に戻る。このようにディレクトリが検出されるたびにリストアップを繰り返すわけであるが,そのたびにスタックが累積的に確保される。
【0013】
上述したようにステップS411で,カレントディレクトリ内の要素検出が完了したと判断すれば,ステップS415にてリストアップのプログラムは終了し,ステップS403に進む。この時点ではじめて確保されたスタックは解放される。
【0014】
このようにしてディレクトリを走査するのであるが,リストアップの処理は,すべてのディレクトリを走査するまで完了しないことから,新たなディレクトリが検出され,ステップS414の処理が呼び出されるたびに累積的にスタックを確保し続けることとなる。確保されたスタックが解放されるタイミングは,ステップS415にてリストアッププログラムがリターンするときのみであるため,ディレクトリの階層が深いほど,つまり,リストアッププログラムが再帰的に呼び出される回数が多いほど,スタックサイズが増大するわけである。
【0015】
再帰的呼び出し処理の回数とスタックとの関係を示したのが図5である。ディレクトリが検出されリストアップ処理が呼び出されるたびにスタックサイズが1つ大きくなり,この図では4つのスタックサイズとなっている。最下層のディレクトリに到達すると,順に上位層に戻っていくのであるが,その際は,スタックが1ずつ減少していく。図示していないが,その過程で別のディレクトリがあれば,再度リストアップ処理を行うためスタックが増加する。
【0016】
このように,必要となるスタックサイズは,ディレクトリ階層の最大値に依存しているが,これは,事前に把握することができるものではないため,ディレクトリの走査は,パソコンほどハードウェアリソースが潤沢でない組み込み機器にとっては,スタックオーバフローのおそれを伴う危険な処理であるという問題があった。
【発明の概要】
【発明が解決しようとする課題】
【0017】
上述した課題に鑑み,本願発明では,ディレクトリ階層の深さに関係なく,一定のメモリ消費量にてディレクトリを走査することができるプログラムを提供することを目的とする。
【課題を解決するための手段】
【0018】
本願発明にかかる第1の形態は,コンピュータに,(1)以下の(2)と(3)を実行するためのメモリをコンピュータ上に確保する手段と,(2)カレントディレクトリ内のファイルおよびディレクトリを検出する手段と,(3)検出したファイルおよびディレクトリの情報を書き出す手段と, (4)(2)および(3)に記載の手段により,カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,(1)で確保したメモリを解放する手段と,書き出した情報にディレクトリの情報が存在し,かつフラグが設定されていないディレクトリをカレントディレクトリとして,(1)から(4)を実行させる手段,として機能させるプログラムである。
【0019】
本願発明にかかる第2の形態は,(1)以下の(2)と(3)を実行するためのメモリをコンピュータ上に確保する手段と,(2)カレントディレクトリ内のファイルおよびディレクトリを検出する手段と,(3)検出したファイルおよびディレクトリの情報を書き出す手段と,(4)(2)および(3)に記載の手段により,カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,(1)で確保したメモリを解放する手段と,書き出した情報にディレクトリの情報が存在し,かつフラグが設定されていないディレクトリをカレントディレクトリとして,(1)から(4)を実行させる手段と,を備えるディレクトリ走査装置である。
【0020】
本願発明にかかる第3の形態は,コンピュータが使用するメモリ消費量を低減する方法であって, (1)以下の(2)と(3)を実行するためのメモリをコンピュータ上に確保するステップと, (2)カレントディレクトリ内のファイルおよびディレクトリを検出するステップと,(3)検出したファイルおよびディレクトリの情報を書き出すステップと,(4)(2)および(3)のステップにより,カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,(1)で確保したメモリを解放するステップと,書き出した情報にディレクトリの情報が存在し,かつフラグが設定されていないディレクトリをカレントディレクトリとして,(1)から(4)を実行させるステップと,を含む方法である。
【発明の効果】
【0021】
本願発明によれば,ディレクトリ走査に関して,プログラムを再帰的に呼び出すことがないので,ディレクトリ階層の深さに関わらず,メモリ消費量を一定に保ちつつ走査を行うことができる。
【発明を実施するための形態】
【0022】
以下では図面を参照し本願発明に係る実施例を説明する。
[実施例]
[本願発明のプログラム構造]
【0023】
図6は本願発明におけるディレクトリ走査のプログラム構造である。なお,対象となるディレクトリ構造は従来技術の説明で用いた図1の通りとする。従来技術である再帰呼び出し処理との大きな違いは,走査処理を進めても,スタックサイズが一定であることである。リストアップしては書き出すという,一見同様の処理を行っているようにも見えるが,このような異なる結果となる要因について以下で説明する。なお,再帰呼び出し処理も本願発明の処理も,ディレクトリ走査という動作の結果得られる成果(ディレクトリおよびファイル情報)については全く同じであり,その手順が異なるだけである。
【0024】
図7は,図1のディレクトリ構造を本願発明の処理にて走査した場合のプログラムの実行回数を示したものである。大きな特徴は,ディレクトリの走査を進めても,プログラムが再帰的に呼び出されておらず,ディレクトリを走査するごとにいったんプログラムを完了(スタック解放)していることである。たとえばディレクトリD1の中を走査する場合,ディレクトリD2とファイルF1を検出し,書き出した時点でリストアップを完了し,書き出した情報の中にディレクトリ(この場合ディレクトリD2)があれば,そのディレクトリについて走査を行う。最終的に,ディレクトリがなくなりファイルだけになれば走査は完了となる。図では,ファイルF2とF3を書き出した時点で完了となる。
【0025】
図3に示す再帰呼び出し処理では,ディレクトリが検出されるたびに,再帰的にリストアップを繰り返す処理となっているため,本願発明のようにリストアッププログラムをいったん完了することなく,プログラムが再帰的に呼び出されている。既に説明したように,プログラムが再帰的に呼び出されるということは,その間,スタックサイズは累積的に増加していることを意味している。
[本願発明による動作フロー]
【0026】
図8は,本願発明によるディレクトリ走査プログラムの動作フローである。ステップS801にてファイルをオープンしプログラムを開始する。ステップS802にてリストアッププログラムを呼び出す。この時点でスタックが確保される。ステップS811にて,カレントディレクトリ内の要素検出が完了したかどうかを判断する。この結果,完了していればステップS813に進み,カレントディレクトリがチェック済みである旨を示すフラグを設定し,ステップS814にてリストアッププログラムは完了する。この時点で,確保されたスタックは解放される。一方,判断の結果,要素検出が完了していなければ,ステップS812に進み要素検出を繰り返す。
【0027】
ステップS803にて,書き出したファイルにフラグの設定されていないディレクトリがあるかどうかを判断する。判断の結果,あればS802にて再度リストアップを行い,なければS804にてファイルをクローズしてプログラムを終了する。
【0028】
本願発明は,このようにしてディレクトリの階層ごとにリストアッププログラムを完了,すなわちスタックを解放するため,ディレクトリ階層の深さに関わらず,スタックサイズは常に一定を保ちつつ,ディレクトリ走査を行うことができる。スタックサイズを常に一定に保つことができる理由は,ステップS702のリストアップ処理が再帰的に呼び出されることがないためであり,常に1回分の処理に必要なスタックしか消費しないからである。
【0029】
図9は,ディレクトリ走査を行う場合の,再帰呼び出し処理と本願発明とのスタックサイズを比較したグラフである。再帰呼び出し処理は,ディレクトリ階層が多くなるごとに,累積的にスタックサイズが大きくなるが,本願発明は常に一定となることがわかる。
[まとめ]
【0030】
本願発明によれば,ディレクトリ走査に関して,プログラムを再帰的に呼び出すことがないので,ディレクトリ階層の深さに関わらず,メモリ消費量を一定に保ちつつ走査を行うことができる。
【図面の簡単な説明】
【0031】
【図1】ディレクトリ構造の全体図
【図2】再帰呼び出しに処理によるディレクトリ走査プログラム構造
【図3】再帰呼び出し処理による再帰プログラムの実行回数
【図4】再帰呼び出しに処理によるディレクトリ走査プログラムの動作フロー
【図5】再帰的呼び出し処理の回数とスタックとの関係
【図6】本願発明のディレクトリ走査プログラム構造
【図7】本願発明によるプログラムの実行回数
【図8】本願発明によるディレクトリ走査プログラムの動作フロー
【図9】再帰呼び出し処理と本願発明のスタックサイズ
【符号の説明】
【0032】
S703 未チェックのディレクトリチェック
S711 ディレクトリ内の要素検出完了チェック
S712 要素の書き出し
S713 チェック済みディレクトリのフラグ設定

【特許請求の範囲】
【請求項1】
コンピュータに,
(1)以下の(2)と(3)を実行するためのメモリを前記コンピュータ上に確保する手段と,
(2)カレントディレクトリ内のファイルおよびディレクトリを検出する手段と,
(3)検出したファイルおよびディレクトリの情報を書き出す手段と,
(4)前記(2)および(3)に記載の手段により,前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,前記(1)で確保したメモリを解放する手段と,
前記書き出した情報にディレクトリの情報が存在し,かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして,前記(1)から(4)を実行させる手段,
として機能させるプログラム。
【請求項2】
(1)以下の(2)と(3)を実行するためのメモリを前記コンピュータ上に確保する手段と,
(2)カレントディレクトリ内のファイルおよびディレクトリを検出する手段と,
(3)検出したファイルおよびディレクトリの情報を書き出す手段と,
(4)前記(2)および(3)に記載の手段により,前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,前記(1)で確保したメモリを解放する手段と,
前記書き出した情報にディレクトリの情報が存在し,かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして,前記(1)から(4)を実行させる手段と,
を備えるディレクトリ走査装置。
【請求項3】
コンピュータが使用するメモリ消費量を低減する方法であって,
(1)以下の(2)と(3)を実行するためのメモリを前記コンピュータ上に確保するステップと,
(2)カレントディレクトリ内のファイルおよびディレクトリを検出するステップと,
(3)検出したファイルおよびディレクトリの情報を書き出すステップと,
(4)前記(2)および(3)のステップにより,前記カレントディレクトリ内のすべてのファイルおよびディレクトリの検出および書き出しが完了すると,前記カレントディレクトリがチェック済みである旨を示すフラグを設定するとともに,前記(1)で確保したメモリを解放するステップと,
前記書き出した情報にディレクトリの情報が存在し,かつ前記フラグが設定されていないディレクトリをカレントディレクトリとして,前記(1)から(4)を実行させるステップと,
を含む方法。



【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2012−216111(P2012−216111A)
【公開日】平成24年11月8日(2012.11.8)
【国際特許分類】
【出願番号】特願2011−81592(P2011−81592)
【出願日】平成23年4月1日(2011.4.1)
【出願人】(500112146)サイレックス・テクノロジー株式会社 (74)