←
▼
▲
Function OpenForDefragmentClass::GetRelativePath( in_HashValueOfMD5 as string,
in_BaseFullPathInMD5List as string ) as string or Empty
初期化時に指定した MD5 リストから指定のハッシュ値を探して、相対パス(relative path)を返します。
【引数】
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.GetRelativePath( "a5e064892e90bdbc0f85d8fe14f6828a", Empty )
Assert step_path = "Sub\File.txt"
サンプル
返り値
相対パス または Empty
in_BaseFullPathInMD5List 引数が Empty ではないときは、ファイルが存在するパスを返します。
ファイルが存在しなければ、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
コピー先のファイルを読み取り専用ではないようにします。
サンプル
コピー元が圧縮されているとき
同じハッシュ値(MD5)のファイルを圧縮ファイルの中からコピー
MD5List.txt
FileC.txt
FileA.txt
fadc3390060b1ba5ef3bef593b7c930d FileA.txt
202cb962ac59075b964b07152d234b70 FileC.txt
in_DestinationFolderPath
_Fragment.7z
Me
FileA.txt
in_BasePathInMD5List
fadc3390060b1ba5ef3bef593b7c930d FileA.txt
60631deb298f23dc7e3a4ada23d8372c FileB.txt
in_SourceFolderPath
FileC.txt
_Fragment.7z
in_SourceFolderPath と in_BasePathInMD5List の引数に指定したフォルダーに、コピー元となる
ファイルが入った _Fragment.7z という名前の圧縮ファイル(7z形式)があったときは、自動的に
T_OpenForDefragment_Unzip
解凍も行い、コピーした結果は同じファイルになります。 解凍は、
で行います。
をすべてのファイルに対して呼び出した後で、CopyFolder すると速くなります。
←
▼
▲
Sub OpenForDefragmentClass::DownloadStart( in_BasePathInMD5List as string,
in_SourceFolderPath as string, in_DestinationFolderPath as string, in_out_Options )
のコピー元のファイルを並列して
【引数】
in_BasePathInMD5List
in_SourceFolderPath
Me の MD5 リストの中にある相対パスの基準パス
コピー元 または _FullSet.txt ファイルがあるフォルダーのパス
in_DestinationFolderPath
in_out_Options
Empty または 各種フラグの論理和
コピー先のフォルダーのパス
ソース
→ ToolsLib.vbs
テスト
T_OpenForDefragment_Unzip_True
\Fragments にコピーします。
の DownloadStart を内部で呼び出しています。
並列にコピーする分、速くコピーが終わります。
←
▼
▲
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 引数に指定したファイルに、MD5 リストの複数行をライトします。
OpenForDefragment に指定したパスと異なるときは、名前を付けて保存したときのように、
開く前のリストも含んだリストを出力します。
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
1つも Append してなかったら、ファイルにアクセスしません。
を呼んでいます。
内部で
←
▼
▲
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 があるフォルダーを
処理対象とします。
未対応
←
▼
▲
Dim OpenForDefragmentClass::ExistenceCache as ExistenceCacheClass
ファイルやフォルダーが存在するかどうかを高速に調べるためのキャッシュ。
対象かどうかは、
の c.AsPath で判定しています。
OpenForDefragmentClass では、キャッシュの対象(ExistenceCacheClass::
TargetRootPath)の初期値が "\\" です。
つまり、共有フォルダー(UNC)が対象になります。
←
▼
▲
に関連するオプション。
ソース
.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"
jp="存在するファイルの一覧に、該当するハッシュ値が見つかりません。"
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つのファイルパスを文字列型で指定することはできません。
←
▼
▲
Dim MD5CacheClass::DefaultHashFileName as string
保存するときのデフォルトのファイル名。 Scan するときにデフォルトでスキップするファイル名。
←
▼
▲
Function MD5CacheClass::GetHashFromStepPath( in_StepPath as string ) as string
ファイルの相対パスから、ファイル固有のハッシュ値を返します。
ソース
→ ToolsLib.vbs
ハッシュ値が登録されていなければ、Empty を返します。
または
の in_TargetPaths 引数に指定したフォルダーのパス(文字列)が、
相対パスの基準パスになります。 in_TargetPaths 引数に PathDictionaryClass のオブジェクトを指定
したときは、その BasePath プロパティが基準パスになります。
参考
←
▼
▲
Function MD5CacheClass::GetFirstStepPathFromHash( in_HashValue as string ) as string
ファイル固有のハッシュ値から、存在する1つのファイルの相対パスを返します。
ソース
→ ToolsLib.vbs
参考
←
▼
▲
Sub MD5CacheClass::SetHashValue( in_StepPath as string, in_HashValue as string )
ファイルのパスに、計算済みのファイル固有のハッシュ値を設定します。
ハッシュ値を計算するよりも早く処理します。
ソース
→ ToolsLib.vbs
in_HashValue 引数に Empty を指定すると、リストから除外されます。
すでに除外されているときは何もせず、エラーにもなりません。
【引数】
in_StepPath
in_HashValue
ファイルの相対パス。 基準は
(出力) in_StepPath に指定したファイルのハッシュ値
←
▼
▲
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 の基準パスは、カレント フォルダーです。
←
▼
▲
Sub MD5CacheClass::Save( in_OutHashCachePath as string or Empty )
ファイル固有のハッシュ値をファイルに保存します。
【引数】
in_OutHashCachePath
ハッシュ値をたくさん記録するファイルのパス
などで登録されたハッシュ値とタイム スタンプを出力します。
2999-12-31T00:00:00Z af7da95e0ba5ff3c49b5c11d3645db85 t10.txt
2999-12-31T00:00:00Z 4787fe8ae24c12988db6b8dbaf686b20 t11.txt
2999-12-31T00:00:00Z a461d688d013e47c4010387e7922940d t12.txt
サンプル
保存されたファイルの内容の例
↑相対パス
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
←
▼
▲
Sub MD5CacheClass::Scan(
in_TargetPaths as Empty or string or PathDictionaryClass,
in_ScanFilterPaths as Empty or string or PathDictionaryClass,
in_IsCompareTimeStamp as boolean )
フォルダーに入っているファイルのハッシュ値を計算して登録します。
【引数】
in_TargetPaths
スキャンする対象のパス
調べるフォルダーのフィルター
in_ScanFilterPaths
in_IsCompareTimeStamp
タイム スタンプが変更されたときだけ再計算するかどうか
存在しないファイルは、ハッシュのリストから除外されます。
in_TargetPaths が Empty のときは、Me.TargetPaths を使います。 Empty でなければ、
Me.TargetPaths を上書きします。
Me.TargetPaths と in_ScanFilterPaths の両方で指定されたファイルを、登録します。
in_ScanFilterPaths が Empty のときは、Me.TargetPaths だけを使います。
したフォルダーに対して
Fragment
Scan するときは、注意してください。
ソース
→ ToolsLib.vbs
テスト
T_MD5Cache
→ T_fc.vbs
←
▼
▲
Sub MD5CacheClass::Fragment(
in_ScanFilterPaths as Empty or string or PathDictionaryClass,
ref_CopiedCache as MD5CacheClass, in_IsCheckFileHash as boolean )
登録されているハッシュ値と同じファイルがあれば、1つを除いて削除します。
【引数】
in_ScanFilterPaths
調べるフォルダーのフィルター
ハッシュ値が登録されている別のキャッシュ
ref_CopiedCache
in_IsCheckFileHash
削除するときにハッシュ値を再計算してチェックするかどうか
Me と in_ScanFilterPaths の両方で指定されたファイルが、削除される候補です。
in_ScanFilterPaths が Empty のときは、Me だけを使います。
"Me.Defragment" で復帰できる限り、同じ内容のファイルを削除します。
"Me" に入っているパスが指すファイルと同じ内容(同じハッシュ値)の
ファイルが、"in_CopiedCache" に入っているパスが指すファイル
にあるとき、"Me" に入っているパスのファイルを削除します。
"Me" に同じ内容のファイルが複数あるときも、1つを除いてファイルを削除
します。
"ref_CopiedCache.DictionaryFromHash( hash )( 0 )" が指すパスにファイルが
存在するように "ref_CopiedCache.DictionaryFromHash( hash )" 配列の要素の
順番が入れ替わります。 削除する前のファイルのコピーが入ったフォルダーが
ゴミ箱に入ります。
削除されたファイルは、
で、復帰できます。
ソース
→ ToolsLib.vbs
テスト
T_MD5Cache_Fragment
→ T_fc.vbs