(for Internet Explorer)
← ▼ ▲
↑
CheckFolderMD5List
Sub CheckFolderMD5List( in_TargetFolderPath as string, in_CorrectMD5ListFilePath as string,
in_Option as Empty )
MD5 リストを使って、フォルダーが正しく復元できたかどうかをチェックします。
【引数】
in_TargetFolderPath
in_CorrectMD5ListFilePath
チェック対象の（復元した）フォルダーのパス、またはその辞書
MD5 リストのファイルパス
関連
テスト
正しく復元できていれば、そのまま関数から返ります。
正しく復元できていなければ、Diff ツールで差分が表示され、エラーになります。
AssertFC
→ MakeFolderMD5List
T_MD5List
→ T_fc.vbs
<< MD5 リスト
ソース
→ ToolsLib.vbs
in_Option
Empty または get_ToolsLibConsts().BasePathIsList
と同じ動きです。
これは、
MakeFolderMD5List
in_TargetFolderPath 引数は、
と同様に辞書（複数の対象フォルダー）を指定できます。
Diff ツールの左側がファイルにある（過去の）MD5リスト、右側が現在のフォルダーの MD5リストです。
対象フォルダーに含まれる MD5リスト
対象のフォルダーの中に MD5リストがあるときは、そのMD5リストの中にはそのMD5リスト
ファイルの MD5が含まれていません。 なぜなら、MD5リストのファイルの MD5 を含んだ
→ IsSameHashValueOfLeafPathDictionary (MD5CacheClass)
MD5リストができないからです。
→ MakeFolderMD5List
CheckFolderMD5List 関数は、MD5リストの有無と、MD5リスト自身のハッシュ値の正しさに
ついては、チェックしません。
in_CorrectMD5ListFilePath 引数にタイムスタンプ付き MD5 リストを指定したとき、タイムスタンプが
異なっていてもエラーにはなりません。
in_Option 引数
Empty
パスでソートします。 ソートするのは内部でチェック対象のフォルダーから一時的に作成する
MD5リストです。 in_CorrectMD5ListFilePath 引数に指定した MD5リストは、ソートしませんが、
tc.BasePathIsList
MD5 リストの中の相対パスの基準フォルダーは、in_MD5ListFilePath 引数の
親フォルダーです。
SortFolderMD5List
MD5 リストの中の相対パスの基準フォルダーは、in_FolderPath 引数です。
でソートできます。
← ▼ ▲
IsSameMD5List
Function IsSameMD5List( in_MD5ListFilePathA as string, in_MD5ListFilePathB as string, in_Option as Empty )
２つの MD5 リストの中のハッシュ値だけを比較して同じかどうかを返します。
【引数】
in_MD5ListFilePathA
in_MD5ListFilePathB
MD5 リストのファイルパス
比較するもう１つの MD5 リストのファイルパス
<< MD5 リスト
in_Option
Empty を指定してください
返り値
ハッシュ値が等しいかどうか
MD5 リストの中に記録されたタイムスタンプは、比較に使われません。
ソース
→ ToolsLib.vbs
→ CheckFolderMD5List
テスト
← ▼ ▲
SortFolderMD5List
Sub SortFolderMD5List( in_InputMD5ListFilePath as string, in_OutputMD5ListFilePath as string,
in_Option as Empty )
MD5 リストを、相対パスでソートします。
【引数】
in_InputMD5ListFilePath
in_OutputMD5ListFilePath
ソートする前の MD5 リストのファイルパス
ソートした後の MD5 リストのファイルパス
→ T_fc.vbs
T_SortFolderMD5List
テスト
ソース
→ ToolsLib.vbs
Empty を指定してください
in_Option
重要なファイルを上書き更新するときは、SortFolderMD5List の in_OutputMD5ListFilePath 引数に
一時的に出力するパスを指定し、その一時ファイルを作成した後（ファイルを閉じた後）で、
SafeFileUpdateEx
を呼び出してください。
改行文字は、CR+LF に統一されます。
ソートするときに使う比較関数は、
PathNameCompare
です。
関連
→ ExpandWildcard_Sort 変数
in_InputMD5ListFilePath 引数と in_OutputMD5ListFilePath 引数に、同じファイルを指定できます。
← ▼ ▲
GetColumnOfPathInFolderMD5List
Function GetColumnOfPathInFolderMD5List( in_MD5ListFilePath as string )
MD5 リストの行を調べて、ファイルのパスがあるカラム番号（1以上）を返します。
【引数】
in_MD5ListFilePath
返り値
MD5 リストのファイルパス
ファイルのパスがあるカラム番号（1以上）
ソース
→ ToolsLib.vbs
テスト
T_GetColumnOfPathInFolderMD5List
→ T_fc.vbs
MD5 リストの中にタイムスタンプがあるときは、60 を返します。
MD5 リストの中にタイムスタンプがないときは、34 を返します。
指定した MD5 リストのファイルの内容がないときは、0 を返します。
指定した MD5 リストのファイルがないときは、エラーになります。
← ▼ ▲
OpenForDefragment
Function OpenForDefragment( in_MD5ListFilePath as string, in_Empty )
MD5 ハッシュ値が同じファイルを探して、コピーする処理を開始します。
【引数】
in_MD5ListFilePath
in_Empty
存在するファイルの MD5 リストのファイル パス
Empty を指定してください
ソース
→ ToolsLib.vbs
テスト
T_OpenForDefragment
→ T_fc.vbs
返り値
→ OpenForDefragmentClass
参考
→ OpenForDefragmentClass
返り値のオブジェクトが削除されるまで、in_MD5ListFilePath 引数に指定したファイルを
読み取りモードで開いています。
返り値のオブジェクトを使って、_FullSet.txt があるフォルダーに対して、
フラグメント（同じ内容のファイルを削除する）や
デフラグメント（完全形に復帰する）ができます。
← ▼ ▲
OpenForDefragmentClass
<< OpenForDefragment
（子ノードを参照してください。）
← ▼ ▲
GetStepPath (OpenForDefragmentClass)
Function OpenForDefragmentClass::GetStepPath( in_HashValueOfMD5 as string,
in_BaseFullPathInMD5List as string ) as string or Empty
初期化時に指定した MD5 リストから指定のハッシュ値を探して、相対パスを返します。
【引数】
in_HashValueOfMD5
in_BaseFullPathInMD5List
探すハッシュ値（MD5）
Empty またはMD5 リストの中にある相対パスの基準パス
<< OpenForDefragmentClass
ソース
→ ToolsLib.vbs
テスト
T_OpenForDefragment_1
→ T_fc.vbs
Set defrag = OpenForDefragment( "Folder\MD5List.txt", Empty )
step_path = defrag.GetStepPath( "a5e064892e90bdbc0f85d8fe14f6828a", Empty )
Assert step_path = "Sub\File.txt"
サンプル
返り値
相対パス または Empty
in_BaseFullPathInMD5List 引数が Empty ではないときは、ファイルが存在するパスを返します。
ハッシュ値の検索に辞書を使っています。
← ▼ ▲
CopyFolder (OpenForDefragmentClass)
Sub OpenForDefragmentClass::CopyFolder( in_BasePathInMD5List as string,
in_SourceFolderPath as string, in_DestinationFolderPath as string, in_out_Options )
_FullSet.txt という名前のファイルに書かれたすべてのファイルを指定のフォルダーにコピーします。
【引数】
in_BasePathInMD5List
in_SourceFolderPath
Me の MD5 リストの中にある相対パスの基準パス
コピー元 または _FullSet.txt ファイルがあるフォルダーのパス
<< OpenForDefragmentClass
in_DestinationFolderPath
in_out_Options
Empty または 各種フラグの論理和
コピー先のフォルダーのパス
ソース
→ ToolsLib.vbs
コピー先にすでにファイルが存在するときはコピーしません。
結果、_FullSet.txt に書かれたハッシュ値と内容が異なる可能性が
あります。 指定しなかったときは、コピー先にすでにファイルが存在する
ときでも、上書きコピーを行います。
テスト
T_OpenForDefragment_CopyFolder
→ T_fc.vbs
Set defrag = OpenForDefragment( "MD5List.txt", Empty )
defrag.CopyFolder "in_BasePathInMD5List", _
"in_SourceFolderPath", "in_DestinationFolderPath", Empty
サンプル
fadc3390060b1ba5ef3bef593b7c930d FileA.txt
60631deb298f23dc7e3a4ada23d8372c FileB.txt
in_BasePathInMD5List
FileA.txt
FileB.txt
Me
in_SourceFolderPath
FileC.txt
(_FullSet.txt)
_FullSet.txt ファイルが in_SourceFolderPath のフォルダーになければ、MD5 は無視され、
in_SourceFolderPath のフォルダーから in_DestinationFolderPath のフォルダーにコピーするだけ
になります。 （in_out_Options 引数に、c.SubFolder を指定しなかったとき）
in_DestinationFolderPath
fadc3390060b1ba5ef3bef593b7c930d FileA.txt
202cb962ac59075b964b07152d234b70 FileC.txt
FileA.txt
FileC.txt
MD5List.txt
_FullSet.txt ファイルがある断片化（Fragment）されたフォルダーを、デフラグ（Defragment）した
完全なフォルダーに復帰、または別のフォルダーに完全なフォルダーをコピーします。 前者（復帰）
をするときは、in_SourceFolderPath 引数 = in_DestinationFolderPath 引数を指定してください。
in_out_Options 引数
c.NotExistOnly
c は、g_VBS_Lib です。
c.ExistOnly
コピー元となるファイル（MD5リストが指すパスのファイル）が存在しない
ときは、エラーにせず無視します。 コピー先のフォルダーを完全に復帰
するには、別の MD5リストからも c.NotExistOnly を指定して CopyFolder
します。 ただし、最後の MD5リストから CopyFolder するときは、
c.ExistOnly を指定せずに CopyFolder します。
同じハッシュ値(MD5)のファイルをコピー
→ in_out_Options 引数
c.SubFolder
in_SourceFolderPath 引数に指定したパスとそのサブ フォルダーにある
すべての _FullSet.txt があるフォルダーを処理対象とします。
in_out_Options 引数には、Empty、下記の定数の論理和、または、OpenForDefragmentOptionClass
を指定できます。
OpenForDefragmentOptionClass
ParseOptionArguments 関数
in_out_Options 引数の出力は、
の出力です。
を指定する場合、Delegate メンバーはユーザー定義です。
参考
→ ハッシュ値が見つからないエラーの対処方法
c.ToNotReadOnly
コピー先のファイルを読み取り専用ではないようにします。
← ▼ ▲
Append (OpenForDefragmentClass)
<< OpenForDefragmentClass
Sub OpenForDefragmentClass::Append(
in_OutputMD5ListFilePath as string, in_BasePathInMD5List as string,
in_FragmentFolderPath as string, in_Empty )
指定のフォルダーの中にあるファイルと同じハッシュ値のファイルが、Me の MD5 リストになければ追加します。
【引数】
in_BasePathInMD5List
in_FragmentFolderPath
Me の MD5 リストの中にある相対パスの基準パス
MD5 リストに追加するファイルがあるフォルダーのパス
in_OutputMD5ListFilePath
Empty または 更新した MD5 リストを保存するパス
ソース
→ ToolsLib.vbs
in_FragmentFolderPath 引数に指定したフォルダー A の中にあるファイルと同じハッシュ値（＝同じ内容）
の行が Me の MD5 リストにすでにある場合は、その行に書かれたパスがフォルダー A の外であっても、
MD5 リストに追加しません。
_FullSet.txt ファイル
Empty を指定してください
in_Empty
in_FragmentFolderPath 引数に指定したフォルダーの直下に
があるときは、
テスト
T_OpenForDefragment_Append_*
→ T_fc.vbs
_FullSet.txt ファイルに書かれたハッシュ値が Me の MD5 リストになければ、MD5 リストに追加します。
フォルダーの中のファイルの列挙やハッシュ値の計算は行いません。
Set defrag = OpenForDefragment( "Folder\MD5List.txt", Empty )
defrag.Append "Folder\MD5List.txt", "Folder", "Folder\NewFragment", Empty
サンプル
in_OutputMD5ListFilePath 引数に Empty を指定すると、変更された MD5 リストをファイルに保存しません。
Save
するときは、本関数で追加された MD5 リストも保存されます。
← ▼ ▲
Save (OpenForDefragmentClass)
<< OpenForDefragmentClass
Sub OpenForDefragmentClass::Save( in_OutputMD5ListFilePath as string )
【引数】
in_OutputMD5ListFilePath
出力する MD5 リストのファイル パス
Append
した MD5 リストをファイルに保存します。
Set defrag = OpenForDefragment( "Folder\MD5List.txt", Empty )
defrag.Append Empty, "Folder", "Folder\NewFragmentA", Empty
defrag.Append Empty, "Folder", "Folder\NewFragmentB", Empty
defrag.Save "Folder\MD5List.txt"
サンプル
ソース
→ ToolsLib.vbs
テスト
T_OpenForDefragment_Append_*
→ T_fc.vbs
Append
← ▼ ▲
Fragment (OpenForDefragmentClass)
<< OpenForDefragmentClass
Sub OpenForDefragmentClass::Fragment( in_BasePathInMD5List as string,
in_FragmentingFolderPath as string, in_Flags )
指定の _FullSet.txt の中にあるファイルのうち、Me の MD5 リストにある ファイルを削除します。
【引数】
in_BasePathInMD5List
in_FragmentingFolderPath
Me の MD5 リストの中にある相対パスの基準パス
削除しようとするファイルを含む
in_Flags
Empty または g_VBS_Lib.SubFolder
ソース
→ ToolsLib.vbs
Me の MD5 リストにあるファイルは、削除しません。
_FullSet.txt ファイル
があるフォルダーのパス
テスト
T_OpenForDefragment_Fragment
→ T_fc.vbs
Set defrag = OpenForDefragment( "Folder\MD5List.txt", Empty )
defrag.Fragment "Folder", "Folder\NewFragment", Empty
サンプル
in_Flags 引数に g_VBS_Lib.SubFolder を指定したときは、in_FragmentingFolderPath 引数に
指定したパスとそのサブ フォルダーにある すべての _FullSet.txt があるフォルダーを
処理対象とします。
未対応
← ▼ ▲
OpenForDefragmentOptionClass
に関連するオプション。
ソース
.Flags
の in_out_Options 引数に指定できる定数
.CopyOneFileFunction
integer
OpenForDefragment
CopyFunction
CopyFolder
の中からコールバックされる関数。
CopyFolder
→ ToolsLib.vbs
ファイルのパスと、OpenForDefragmentOptionClass
が渡されます。
variant
.Delegate
ユーザー定義、または、コール元定義
.CurrentTimeStampInFullSetFile
string
CopyFolder
の中からコールバックされたとき、
_FullSet.txt ファイルに書かれたタイムスタンプ。
W3CDTF 型。
← ▼ ▲
ハッシュ値が見つからないエラーの対処方法。 Not found hash value in a list
OpenForDefragment
の
CopyFolder
で、ハッシュ値が見つからないエラー（例：下記）になったときの
状況と対処方法について説明します。
<ERROR msg="Not found hash value in a list in order to defragment a file"
hash_value="c678ba46bc07e2062f66b188b0f520cf"
copy_source="C:\Masters\ModuleA"
copy_destination="_work\ModuleA"
defragmenting_path="C:\Masters\ModuleA\A_Copy.txt"
not_found_in="C:\Masters\MD5List.txt"
found_in="C:\Masters\ModuleA\_FullSet.txt"/>
ソース
→ ToolsLib.vbs
状況
_FullSet.txt
A_Copy.txt
:
c678... A_Copy.txt
:
:
c678... A.txt
:
A.txt
MD5List.txt
エラーメッセージの XML の中にある defragmenting_path 属性の値が、復元（Defragment）しようと
しているファイルのパスです。 not_found_in 属性の値は、復元の元となる内容のハッシュ値
（コピー元となるファイルの内容のハッシュ値）が書かれているはずのハッシュ リストのファイルの
パスです。 このハッシュ値は、found_in 属性の値に書かれたパス（_FullSet.txt）にあるファイルから
調べた値です。 下記の図は、正常動作する場合を表しています。
c678... は、
c678ba46bc07e2062f66b188b0f520cf
の省略です。
MD5List.txt
:
????
:
not_found_in 属性の値に書かれたパスにあるハッシュ リスト ファイル（MD5List.txt）の中に、
ハッシュ値（c678ba46bc07e2062f66b188b0f520cf） が存在しないと、ハッシュ値が見つからない
エラーになります。
:
c678... A_Copy.txt
:
A_Copy.txt
_FullSet.txt
?
対処方法
→ 対処方法
→ 状況
まず、復元するファイル（defragmenting_path 属性の値、例： A_Copy.txt）の正しい内容を決めます。
(B) 正しい内容のハッシュ値が、エラー メッセージに含まれるハッシュ値（c678...）と異なるのであれば、
_FullSet.txt ファイルに書かれたハッシュ値を修正します。
(B-X) また、コピー元とコピー先で同じ内容になるのであれば、MD5List.txt の内容と、コピー元の
ファイルの内容を修正します。
_FullSet.txt
:
c678... A_Copy.txt
:
:
c678... A.txt
:
MD5List.txt
A.txt
c678... A.txt
:
0db2... A.txt
:
MD5List.txt
:
0db2... A_Copy.txt
:
_FullSet.txt
0db2...
(B-Y) 正しい内容がコピー元と異なるのであれば、コピー先だったパスにファイルを追加します。
0db2...
_FullSet.txt
:
0db2... A_Copy.txt
:
MD5List.txt
:
c678... A.txt
:
A_Copy.txt
0db2... A.txt
A.txt
0db2...
コピー
サンプル
（下の図の左上）
（下の図の右下）
（下の図の左下）
c678... A.txt
正しい内容→
正しい内容→
正しい内容→
(追加)
defragmenting_path
not_found_in
found_in
(A) 正しい内容のハッシュ値が、エラー メッセージに含まれるハッシュ値（c678...）と同じであれば、
MD5List.txt ファイルにそのハッシュ値を作り、コピー元となるファイルを作成します。
GetHash
そして、そのハッシュ値を
などで調べてください。
← ▼ ▲
MD5CacheClass
ファイルのパスと、
MD5
ソース
→ ToolsLib.vbs
のハッシュ値の関連を表現する辞書。
辞書の内容はファイルに保存(Save)・ファイルから復帰(Load)することができます。
ハッシュ値を計算(Scan)するときは、前回計算したときのタイムスタンプと異なるファイルだけ再計算する
ことで、高速に MD5 の辞書を更新します。
MD5 リストのファイルを作成しておけば、フォルダーのサイズを削減するため同じハッシュ値のファイルを
一時的に削除（Fragment）したり、必要な時にファイルを復帰（Defragment）したりすることができます。
テスト
T_MD5Cache
→ T_fc.vbs
Set hashes = new_MD5CacheClass( get_MD5CacheConst().TimeStamp )
hashes.Initialize hashes.c.TimeStamp
hashes.TargetPaths = "C:\Folder"
hashes.Scan Empty, Empty, False
hashes.Save "_HashCache.txt"
サンプル
タイムスタンプ付きの MD5リストも扱えます。 タイムスタンプが違ったファイルだけ再計算することも
できます。
MD5
ファイル名
（相対パス）
2015-12-28T11:13:34+09:00 fadc3390060b1ba5ef3bef593b7c930d FileA.txt
2016-02-20T11:01:04+09:00 60631deb298f23dc7e3a4ada23d8372c FileB.txt
FileB.txt
FileA.txt
ハッシュ値のみチェック、タイムスタンプが違ったファイルだけ再計算
復元したフォルダー
MD5 リスト
タイムスタンプ
注意
デフラグ機能については、MD5CacheClass を改良した
OpenForDefragment
をお使いください。
← ▼ ▲
TargetPaths
Dim MD5CacheClass::TargetPaths as string or PathDictionaryClass
MD5リストの中の相対パスの基準となるパス、または、MD5リストを構成するファイルのリスト。
PathDictionaryClass
１つのファイルパスを文字列型で指定することはできません。
← ▼ ▲
DefaultHashFileName
Dim MD5CacheClass::DefaultHashFileName as string
保存するときのデフォルトのファイル名。 Scan するときにデフォルトでスキップするファイル名。
← ▼ ▲
GetHashFromStepPath
Function MD5CacheClass::GetHashFromStepPath( in_StepPath as string ) as string
ファイルの相対パスから、ファイル固有のハッシュ値を返します。
ソース
→ ToolsLib.vbs
ハッシュ値が登録されていなければ、Empty を返します。
相対パスの基準パス
Load メソッド
Scan メソッド
または
の in_TargetPaths 引数に指定したフォルダーのパス（文字列）が、
相対パスの基準パスになります。 in_TargetPaths 引数に PathDictionaryClass のオブジェクトを指定
したときは、その BasePath プロパティが基準パスになります。
参考
→ GetBasePath
← ▼ ▲
GetFirstStepPathFromHash
Function MD5CacheClass::GetFirstStepPathFromHash( in_HashValue as string ) as string
ファイル固有のハッシュ値から、存在する１つのファイルの相対パスを返します。
ソース
→ ToolsLib.vbs
参考
→ 相対パスの基準パス
← ▼ ▲
SetHashValue
Sub MD5CacheClass::SetHashValue( in_StepPath as string, in_HashValue as string )
ファイルのパスに、計算済みのファイル固有のハッシュ値を設定します。
ハッシュ値を計算するよりも早く処理します。
ソース
→ ToolsLib.vbs
in_HashValue 引数に Empty を指定すると、リストから除外されます。
すでに除外されているときは何もせず、エラーにもなりません。
【引数】
in_StepPath
in_HashValue
ファイルの相対パス。 基準は
（出力） in_StepPath に指定したファイルのハッシュ値
→ 相対パスの基準パス
← ▼ ▲
Load
Sub MD5CacheClass::Load( in_HashCachePath as string,
in_TargetPaths as string or PathDictionaryClass )
計算済みのファイル固有のハッシュ値がたくさん記録されたファイルをロードします。
【引数】
in_HashCachePath
in_TargetPaths
ハッシュ値がたくさん記録されたファイルのパス
Empty、または、スキャンする対象のパス
in_TargetPaths に指定したフル パスを Me.TargetPaths に設定します。
in_TargetPaths に Empty を指定したら、in_HashCachePath の親フォルダーのパスを in_TargetPaths に
指定したときと同じ動きをします。 PathDictionaryClass のオブジェクトを指定することもできます。
ソース
→ ToolsLib.vbs
テスト
T_MD5Cache
→ T_fc.vbs
in_HashCachePath の基準パスは、カレント フォルダーです。
← ▼ ▲
Save
Sub MD5CacheClass::Save( in_OutHashCachePath as string or Empty )
ファイル固有のハッシュ値をファイルに保存します。
【引数】
in_OutHashCachePath
ハッシュ値をたくさん記録するファイルのパス
Scan
などで登録されたハッシュ値とタイム スタンプを出力します。
2999-12-31T00:00:00Z af7da95e0ba5ff3c49b5c11d3645db85 t10.txt
2999-12-31T00:00:00Z 4787fe8ae24c12988db6b8dbaf686b20 t11.txt
2999-12-31T00:00:00Z a461d688d013e47c4010387e7922940d t12.txt
サンプル
保存されたファイルの内容の例
↑相対パス
↑MD5
↑W3C-DTF
g_FileHashCache.RemoveAll
Set cache = new MD5CacheClass
cache.Scan "Folder", Empty, False
cache.Save "_HashCache.txt"
サンプル
フォルダーに入っているファイルのハッシュ値を計算して保存します
ソース
→ ToolsLib.vbs
in_OutHashCachePath が Empty のときは、Me.DefaultHashFileName に保存します。
基準は Scan 時のパス
テスト
T_MD5Cache
→ T_fc.vbs
←
↓