(for Internet Explorer)
Sub  MakeFolderMD5List( in_FolderPath as string,  in_MD5ListFilePath as string,  in_Option )
後でフォルダーが正しく復元できたかどうかをチェックできるように、MD5 リストを作成します。
【引数】
in_FolderPath
in_MD5ListFilePath
対象のフォルダーのパス、またはその辞書
作成する MD5 リストのファイルパス
関連
テスト
ソース
T_MD5List
→ T_fc.vbs
→ ToolsLib.vbs
ファイル名が Ascii 文字だけのときは、Ascii 形式テキストファイルができます。
Ascii 文字以外が含まれるときは、Unicode 形式テキストファイルができます。
空のフォルダーも列挙します。 その MD5 値は、0が32文字です(vbslib 新仕様)。
in_FolderPath 引数 - 複数の対象フォルダー
複数の対象のフォルダーに対する MD5リストを1つのファイルに出力するときは、
in_FolderPath 引数に辞書型を指定します。
・Key: MD5リストに含まれるパスの左に付ける文字列
・Item: 対象のフォルダーのパス
202cb962ac59075b964b07152d234b70 %A%\example.txt
fd758aae4cede6a4d6e44ef59b18e799 %B%\example.txt
MD5List.txt:
MakeFolderMD5List  "C:\Target", "MD5List.txt", Empty  '// Write to "MD5List.txt"
サンプル
MakeFolderMD5List  Dict(Array( "%A%\", "C:\TargetA", "%B%\", "C:\TargetB" )), _
    "MD5List.txt", Empty
サンプル
対象フォルダーに含まれる MD5リスト
in_Option
対象フォルダーの中に MD5リストを作成することはできますが、
そのMD5リストの中に作成しようとしている MD5リストを含めることはできません。
なぜなら、MD5リストのMD5が作成する前のMD5になってしまうからです。
Empty
パスでソートします。
MD5 リストの中の相対パスの基準フォルダーは、in_FolderPath 引数の値です。
tc.IncludeFullSet
tc.FasterButNotSorted
ソートしません。 やや高速に処理します。
に使えなくなります。
には使えます。
とも使えなくなります。
があるフォルダーは、ファイルを列挙せず _FullSet.txt の内容を読みます。
tc.FasterButNotSorted と or で同時に指定してください。
tc.TimeStamp
MD5 リストにファイルの更新日時も含めます。
tc は、get_ToolsLibConsts() です。
で使えるようになります。
tc.BasePathIsList
MD5 リストの中の相対パスの基準フォルダーは、in_MD5ListFilePath 引数の値の
親フォルダーです。
指定しなかったときの基準フォルダーは、in_FolderPath 引数の値です。
Empty または、下記の論理和を指定します。
Sub  CheckFolderMD5List( in_TargetFolderPath as string,  in_CorrectMD5ListFilePath as string,
    in_Option as Empty )
MD5 リストを使って、フォルダーが正しく復元できたかどうかをチェックします。
【引数】
in_TargetFolderPath
in_CorrectMD5ListFilePath
チェック対象の(復元した)フォルダーのパス、またはその辞書
MD5 リストのファイルパス
関連
テスト
正しく復元できていれば、そのまま関数から返ります。
正しく復元できていなければ、Diff ツールで差分が表示され、エラーになります。
T_MD5List
→ T_fc.vbs
ソース
→ ToolsLib.vbs
in_Option
Empty または get_ToolsLibConsts().BasePathIsList
と同じ動きです。
これは、
in_TargetFolderPath 引数は、
と同様に辞書(複数の対象フォルダー)を指定できます。
Diff ツールの左側がファイルにある(過去の)MD5リスト、右側が現在のフォルダーの MD5リストです。
対象フォルダーに含まれる MD5リスト
対象のフォルダーの中に MD5リストがあるときは、そのMD5リストの中にはそのMD5リスト
ファイルの MD5が含まれていません。 なぜなら、MD5リストのファイルの MD5 を含んだ
→ IsSameHashValueOfLeafPathDictionary (MD5CacheClass)
MD5リストができないからです。
CheckFolderMD5List 関数は、MD5リストの有無と、MD5リスト自身のハッシュ値の正しさに
ついては、チェックしません。
in_CorrectMD5ListFilePath 引数にタイムスタンプ付き MD5 リストを指定したとき、タイムスタンプが
異なっていてもエラーにはなりません。
Empty
パスでソートします。 ソートするのは内部でチェック対象のフォルダーから一時的に作成する
MD5リストです。 in_CorrectMD5ListFilePath 引数に指定した MD5リストは、ソートしませんが、
tc.BasePathIsList
MD5 リストの中の相対パスの基準フォルダーは、in_MD5ListFilePath 引数の
親フォルダーです。
MD5 リストの中の相対パスの基準フォルダーは、in_FolderPath 引数です。
でソートできます。
c.TimeStamp
c は、g_VBS_Lib です。 tc は、get_ToolsLibConsts() です。
正しく復元できていたら、ファイルのタイムスタンプを MD5リストに書かれた日時に変更します。
Function  IsSameMD5List( in_MD5ListFilePathA as string,  in_MD5ListFilePathB as string,  in_Option as Empty )
2つの MD5 リストの中のハッシュ値だけを比較して同じかどうかを返します。
【引数】
in_MD5ListFilePathA
in_MD5ListFilePathB
MD5 リストのファイルパス
比較するもう1つの MD5 リストのファイルパス
in_Option
Empty を指定してください
返り値
ハッシュ値が等しいかどうか
MD5 リストの中に記録されたタイムスタンプは、比較に使われません。
ソース
→ ToolsLib.vbs
テスト
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 引数に
一時的に出力するパスを指定し、その一時ファイルを作成した後(ファイルを閉じた後)で、
を呼び出してください。
改行文字は、CR+LF に統一されます。
ソートするときに使う比較関数は、
です。
関連
in_InputMD5ListFilePath 引数と in_OutputMD5ListFilePath 引数に、同じファイルを指定できます。
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 リストのファイルがないときは、エラーになります。
Function  OpenForDefragment( in_MD5ListFilePath  as string,  in_Empty )
MD5 ハッシュ値が同じファイルを探して、コピーする処理を開始します。
【引数】
in_MD5ListFilePath
in_Empty
存在するファイルの MD5 リストのファイル パス
Empty を指定してください
ソース
→ ToolsLib.vbs
テスト
T_OpenForDefragment
→ T_fc.vbs
返り値
参考
返り値のオブジェクトが削除されるまで、in_MD5ListFilePath 引数に指定したファイルを
読み取りモードで開いています。
返り値のオブジェクトを使って、_FullSet.txt があるフォルダーに対して、
フラグメント(同じ内容のファイルを削除する)や
デフラグメント(完全形に復帰する)ができます。
(子ノードを参照してください。)
Function  OpenForDefragmentClass::GetStepPath( in_HashValueOfMD5  as string,
    in_BaseFullPathInMD5List  as string ) as string or Empty
初期化時に指定した MD5 リストから指定のハッシュ値を探して、相対パスを返します。
【引数】
in_HashValueOfMD5
in_BaseFullPathInMD5List
探すハッシュ値(MD5)
Empty またはMD5 リストの中にある相対パスの基準パス
ソース
→ 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 ではないときは、ファイルが存在するパスを返します。
ハッシュ値が一致するファイルがないときは、Empty を返します。
ハッシュ値の検索に辞書を使っています。
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 ファイルがあるフォルダーのパス
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 ファイルが 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 引数を指定してください。
c は、g_VBS_Lib です。
コピー元となるファイル(MD5リストが指すパスのファイル)が存在しない
ときは、エラーにせず無視します。 コピー先のフォルダーを完全に復帰
するには、別の MD5リストからも c.NotExistOnly を指定して CopyFolder
します。 ただし、最後の MD5リストから CopyFolder するときは、
c.ExistOnly を指定せずに CopyFolder します。
同じハッシュ値(MD5)のファイルをコピー
c.SubFolder
in_SourceFolderPath 引数に指定したパスとそのサブ フォルダーにある
すべての _FullSet.txt があるフォルダーを処理対象とします。
in_out_Options 引数には、Empty、下記の定数の論理和、または、OpenForDefragmentOptionClass
を指定できます。
in_out_Options 引数の出力は、
の出力です。
を指定する場合、Delegate メンバーはユーザー定義です。
参考
c.ToNotReadOnly
コピー先のファイルを読み取り専用ではないようにします。
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 リストに追加しません。
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 リストをファイルに保存しません。
するときは、本関数で追加された MD5 リストも保存されます。
Sub  OpenForDefragmentClass::Save( in_OutputMD5ListFilePath  as string )
【引数】
in_OutputMD5ListFilePath
出力する MD5 リストのファイル パス
した 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
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 リストにあるファイルは、削除しません。
があるフォルダーのパス
テスト
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 があるフォルダーを
処理対象とします。
未対応
に関連するオプション。
ソース
.Flags
の in_out_Options 引数に指定できる定数
.CopyOneFileFunction
integer
の中からコールバックされる関数。
→ ToolsLib.vbs
ファイルのパスと、OpenForDefragmentOptionClass
が渡されます。
variant
.Delegate
ユーザー定義、または、コール元定義
.CurrentTimeStampInFullSetFile
string
の中からコールバックされたとき、
 _FullSet.txt ファイルに書かれたタイムスタンプ。
W3CDTF 型。
で、ハッシュ値が見つからないエラー(例:下記)になったときの
状況と対処方法について説明します。
<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 ファイルにそのハッシュ値を作り、コピー元となるファイルを作成します。
そして、そのハッシュ値を
などで調べてください。
ファイルのパスと、
ソース
→ 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リストも扱えます。 タイムスタンプが違ったファイルだけ再計算することも
できます。
ファイル名
(相対パス)
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 を改良した
をお使いください。
Dim  MD5CacheClass::TargetPaths as string or PathDictionaryClass
MD5リストの中の相対パスの基準となるパス、または、MD5リストを構成するファイルのリスト。
1つのファイルパスを文字列型で指定することはできません。