←
▼
▲
(src)
フォルダの中のファイル・オブジェクトを高速に辞書に列挙します。
【引数】
out_Files
FolderOrPath
(出力) ファイルのオブジェクトの辞書
調べるフォルダのパス。 または、Folder オブジェクト(高速)
Sub EnumFileObjectDic( FolderOrPath as string or Folder, out_Files as dictinoary of File
out_Files は辞書型です。 キーは、ファイル名です。 アイテムは、File オブジェクトです。
サブ・フォルダーにあるファイルは列挙しません。
Dim files1, files2, file_name
EnumFileObjectDic "C:\FolderA", files1 '// [out] files1
EnumFileObjectDic "C:\FolderB", files2 '// [out] files2
For Each file_name In files1.Keys
If not files2.Exists( file_name ) Then
copy "C:\FolderA\"+ file_name, "C:\FolderB"
End If
Next
サンプル
EnumFileObjectDic
EnumFileObjectDic
←
▼
▲
Sub EnumFolderObject( FolderPath as string, out_Folders as array of Folder )
サブフォルダのオブジェクトを高速に列挙します。 サブフォルダのサブフォルダも列挙します。
【引数】
out_Folders
FolderPath
(出力) サブフォルダのオブジェクトの配列
調べるフォルダのパス。 このフォルダの中から列挙します
(src)
Dim folders, fo, fi
Dim fname_key : Set fname_key = new StrMatchKey
fname_key.Keyword = LCase( "*.txt" )
EnumFolderObject "C:\FolderA", folders '// [out] folders
For Each fo In folders '// fo as Folder
For Each fi In fo.Files '// fo as File
If fname_key.IsMatch( fi.Name ) Then
echo fi.DateLastModified
End If
Next
Next
関連
out_Folders には、FolderPath の Folder オブジェクトと、FolderPath のサブフォルダーの
Folder オブジェクトの両方が含まれます。
サンプル
EnumFolderObject
サブ・フォルダーを列挙しない場合
←
▼
▲
Sub GetSubFolders( folders as array of string, path as string )
サブフォルダのパスを列挙します。 サブフォルダのサブフォルダも列挙します。
【引数】
folders
path
(出力) サブフォルダのパスの配列
調べるフォルダのパス。 このフォルダの中から列挙します
関連
(src)
←
▼
▲
行頭の空白文字をタブ文字に変換します
テスト
→ T_ChangeTabSpace フォルダ
行頭のタブ文字を空白文字に変換します
行頭以外の空白文字をタブ文字に変換します
行頭以外のタブ文字を空白文字に変換します
←
▼
▲
Sub ChangeHeadSpaceToTab( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭の空白文字をタブ文字に変換します。
【引数】
ReadStream
WriteStream
変換前のテキスト・ファイル・ストリーム
変換後のテキスト・ファイル・ストリーム
TabSize
1つのタブ文字あたりの空白文字の数
ToolsLib.vbs (src)
←
▼
▲
Sub ChangeHeadTabToSpace( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭のタブ文字を空白文字に変換します。
【引数】
ReadStream
WriteStream
変換前のテキスト・ファイル・ストリーム
変換後のテキスト・ファイル・ストリーム
TabSize
1つのタブ文字あたりの空白文字の数
ToolsLib.vbs (src)
←
▼
▲
Sub ChangeMiddleSpaceToTab( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭以外の空白文字をタブ文字に変換します。
【引数】
ReadStream
WriteStream
変換前のテキスト・ファイル・ストリーム
変換後のテキスト・ファイル・ストリーム
TabSize
1つのタブ文字あたりの空白文字の数
ToolsLib.vbs (src)
←
▼
▲
Sub ChangeMiddleTabToSpace( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭以外のタブ文字を空白文字に変換します。
【引数】
ReadStream
WriteStream
変換前のテキスト・ファイル・ストリーム
変換後のテキスト・ファイル・ストリーム
TabSize
1つのタブ文字あたりの空白文字の数
ToolsLib.vbs (src)
←
▼
▲
Sub SetBreakByFName( FName as string )
指定した名前のファイルをライトするときにブレークさせます。
【引数】
FName
ブレークするファイル名(フォルダパス指定不可)
g_debug ≧ 1 のときだけブレークします。
vbslib の関数(copy、del、OpenForWrite など)ではない(g_fs.CopyFile など)関数によって
ライトしたときはブレークしません。
(src)
→ T_Debug フォルダ
テスト
サンプル:
SetBreakByFName "Out.txt"
関連
←
▼
▲
(src)
Function IsWriteAccessDenied( ErrNumber as integer, Path as string,
FolderOrFile as bitfield, in_out_nRetry as integer )
負荷が高いときに発生する書き込み拒否エラーに対処します。
【引数】
ErrNumber
チェックするエラーコード
返り値
書き込み拒否エラーが発生したかどうか
<WARNING msg="書き込みできません。" msg2="再試行しています" retry_count="1"
path="C:\folder\file.txt"/>
VBScript (Windows) では、ファイルがロックされたときだけでなく、ディスク・アクセスの負荷が
高くなると、書き込み拒否エラー(エラーコード 70)が発生します。 このエラーに対処しないと、
スクリプトによる自動実行が中断されてしまいます。 IsWriteAccessDenied は、書き込み拒否
エラーによってスクリプトが中断されないように、再試行するスクリプトの記述を補助します。
コマンドプロンプト(cscript.exe)で動く vbslib で、書き込み拒否エラーが発生したら、
次の警告を表示して、グローバル変数 g_FileSystemRetryMSec に指定した時間(ミリ秒)
(通常4秒)だけ Sleep します。 グローバル変数 g_FileSystemMaxRetryMSec に指定した
時間(ミリ秒)(通常60秒)だけ再試行したら、書き込み拒否エラーを発生させます。
再試行は、IsWriteAccessDenied の内部では行いません。 参考:下記サンプル。
ウィンドウ(wscript.exe)で動く vbslib で、書き込み拒否エラーが発生したら、次の警告を
表示して [ 再試行 ] か [ キャンセル ] を選ぶメッセージボックスが表示されます。
ユーザーが入力するまで自動実行は一時停止します。
書き込みできません。
[再試行] [キャンセル]
アクセスしたパス
(入出力) 再試行回数
Path
in_out_nRetry
Dim f, path, n_retry, en, ed
n_retry = 0
Do
On Error Resume Next
Set f = g_fs.CreateTextFile( path )
en = Err.Number : ed = Err.Description : On Error GoTo 0
If not IsWriteAccessDenied( en, path, F_File, n_retry ) Then Exit Do
Loop
If en <> 0 Then Err.Raise en,,ed
サンプル: 高負荷状態でも使える CreateTextFile
path
path
再試行ユーザーインターフェース
参考
FolderOrFile
F_File または F_Folder または F_File or F_Folder
テスト
→ T_Replace_target.vbs # T_FromLock
→ T_Copy.vbs # T_CopyLocked
→ T_File.vbs # T_OverwriteFolderFile
→ T_File_c_Manual.vbs
→ T_File_w_Manual.vbs
キーワード:
書き込み拒否エラー(エラーコード 70)が発生する可能性があるものの例
g_fs.CopyFile, g_fs.CopyFolder, g_fs.MoveFile, g_fs.MoveFolder
g_fs.DeleteFolder, g_fs.CreateFolder
g_fs.CreateTextFile, g_fs.OpenTextFile
File::Name への代入による改名, ADODBStream::SaveToFile
vbslib が提供するファイル操作機能は、書き込み拒否エラーが発生しないように対処されて
いるため、IsWriteAccessDenied を呼び出す必要はありません。
←
▼
▲
バイナリ・ファイルのデータを扱いやすくするクラスです。
ファイルを配列のように扱うことができます。
関連
Set bin = new BinaryArray
bin.Size = 4
bin(0) = &hFF '// low byte of BOM
bin(1) = &hFE '// high byte of BOM
bin(2) = &h80 '// low byte of hiragana mu
bin(3) = &h30 '// high byte of hiragana mu
bin.Save "unicode_sample.txt"
サンプル
バイナリ・ファイルへライト。 Unicode 形式のテキストファイル 「む(=0x3080)」 を作る
Set bin = new BinaryArray
bin.Load "unicode_sample.txt"
If bin(0) = &hFF and bin(1) = &hFE Then
echo "This is unicode file."
End If
バイナリ・ファイルからリード。Unicode 形式のテキストファイルかどうか判定する
メンバー
Set bin = new BinaryArray
bin.Load "unicode_sample.txt"
strbin = bin.Read( Empty, Empty )
strbin = LeftB( strbin, 2 ) + ChrB( &h6F ) + ChrB( &h30 ) + MidB( strbin, 3 )
bin.Write strbin, 0, Empty
bin.Save "unicode_sample.txt"
LeftB, MidB, RightB, LenB, AscB, ChrB は、文字列操作関数のバイナリ版です。
ファイル:
System.vbs
配列の要素。 配列番号。 (デフォルト・プロパティ)
配列の要素数。 バイト・サイズ
配列の要素数。 バイト・サイズ
配列の要素数。 バイト・サイズ
配列の要素数を変更します。 ReDim Preserve と同じです。
ファイルの内容を、配列に入力します。
配列の内容を、ファイルに出力します。
配列の内容の一部を、Byte 配列にして返します。
配列の内容の一部を、変更します。
配列を空にします。 配列要素数は 0 になります。
配列の最大要素番号を返します。
配列のすべての要素を文字列にします。
テスト
→ T_Binary フォルダ
(src)
配列の内容の一部を、構造化した辞書を取得します。
構造化した配列を使って、バイナリ配列の内容の一部にライトします。
Dim bin, out, size
bin.Write &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
size = bin.ReadStruct( &h10, out, Array( "a", vbByte, "b", vbInteger+vbArray, 3 ) )
'// out("a") = &h12
'// out("b")(0) = &h5634
'// out("b")(1) = &h9A78
'// out("b")(2) = &hDEBC
バイナリ・ファイルを構造化してリードする
.WriteFromBinaryArray
配列の内容の一部をコピーします。
←
▼
▲
Default Property BinaryArray::Item( i as integer ) as integer
配列番号を使って、バイナリ配列の要素を参照します。 (デフォルト・プロパティ)
【引数】
i
配列の要素の番号。 先頭は 0
Dim bin : Set bin = new BinaryArray
bin.Load "a.bin"
echo bin(0) '// bin.Item(0) と同じ
bin(0) = &h30
サンプル
bin(0)
bin(0)
(src)
1バイトずつアクセスします。
←
▼
▲
Property BinaryArray::Size as integer
Property BinaryArray::Length as integer
Property BinaryArray::Count as integer
バイナリ配列の要素数。 バイト・サイズ
値を設定すると、配列のサイズが変化します。
大きくなった部分の値は、0x00 になります。
小さくなった部分は削除されます。
Dim bin : Set bin = new BinaryArray
bin.Load "a.bin"
bin.Size = bin.Size + 1
bin.Save "a_plus1.bin"
サンプル
Size
Size
←
▼
▲
Sub BinaryArray::ReDim_( UBound as integer )
バイナリ配列の要素数(=バイトサイズ)を変更します。 ReDim Preserve と同じです。
【引数】
UBound
新しい配列の最大要素番号
ReDim の末尾にアンダースコアが付いています。
(ReDim は予約語であるため。)
(src)
←
▼
▲
Sub BinaryArray::Load( Path as string )
ファイルの内容を、バイナリ配列に入力します。
【引数】
Path
ファイルのパス
バイナリ配列に元々入っていた内容は無くなります。
←
▼
▲
Sub BinaryArray::Save( Path as string )
バイナリ配列の内容を、ファイルに出力します。
【引数】
Path
ファイルのパス
Dim i
Dim bin : Set bin = new BinaryArray
bin.ReDim_ &hFF
For i=0 To &hFF : bin(i) = i : Next
bin.Save "a.bin"
サンプル
←
▼
▲
Function BinaryArray::Read( Offset as integer, Length as integer ) as array of Byte
バイナリ配列の内容の一部を、Byte 配列にして返します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
配列の中で抽出する部分の長さ(バイト)。 -1 = 最後まで
Length
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
返り値
配列の内容の一部を抽出した Byte 配列
返り値に、文字列関数 LeftB, MidB, RightB, LenB, AscB, ChrB を使うことができます。
返り値に対して + 演算子は使えませんが、MidB( ByteArray, 1 ) などで String 型に変換
すれば、+ 演算子が使えます。
サンプル
binary = bin.Read( &h10, &h28 )
echo AscB( MidB( binary, 3, 1 ) )
サンプル
(src)
関連
←
▼
▲
Sub BinaryArray::Write( Offset as integer, Length as integer, ByteArray as variant )
バイナリ配列の内容の一部を、変更します。
【引数】
ByteArray
変更内容が格納された文字列、または配列、または数値
Length
配列の中で変更する部分の長さ(バイト)。 -1 = ByteArray 全体
配列の中で変更する部分の先頭の位置。 配列の先頭から = 0
Offset
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
サンプル
bin.Write 0, Empty, Array( &h42, &h4D )
サンプル
bin.Write 0, 2, ChrB( &h42 ) + ChrB( &h4D )
bin.Write 1, 1, &h4D
関連
(src)
←
▼
▲
Function BinaryArray::ReadStruct( Offset as integer, out_Dic as dictionary,
FormatArray as integer ) as integer
バイナリ配列の内容の一部をリードした内容を、構造化した辞書を取得します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
(出力) 数値の辞書。 キーは FormatArray に指定したもの。
out_Dic
返り値
抽出した部分のバイナリの大きさ(バイト)
サンプル
Dim bin, out, size
bin.Write &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
size = bin.ReadStruct( &h10, out, Array( "a", vbByte, "b", vbInteger+vbArray, 3 ) )
'// out("a") = &h12
'// out("b")(0) = &h5634
'// out("b")(1) = &h9A78
'// out("b")(2) = &hDEBC
バイナリ配列から抽出する部分の型の集合 (下記)
FormatArray
(src)
FormatArray 引数
out_Dic (辞書型) に格納するキーの名前と、値の型を、順番に並べた配列を指定します。
vbInteger などの型に +vbArray したときは、配列をリードします。 このとき、更に配列の
要素数を指定してください。 要素数を -1 にすると、ファイルの最後までリードします。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
* + vbArray
配列。 vbByte などの型に vbArray をプラスしてください。
FormatArray には、配列の要素数も指定してください。
要素数を -1 にすると、ファイルの最後までリードします。
&h10 out
"a", vbByte, "b", vbInteger+vbArray, 3
関連
←
▼
▲
Sub BinaryArray::WriteStruct( Offset as integer, FormatAndDataArray as array )
構造化した配列を使って、バイナリ配列の内容の一部に、数値の集合をライトします。
【引数】
Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリ配列へライトする部分の型とライトする値の集合 (下記)
FormatAndDataArray
サンプル
bin.WriteStruct &h40, Array( vbByte, &h12, vbInteger, Array( &h5634, &h9A78, &hDEBC ) )
'// bin = 0x0040 : 12 34 56 78 9A BC DE
関連
(src)
FormatAndDataArray 引数
値の型と、値を、並べた配列を指定します。
値に配列を指定することもできます。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
←
▼
▲
Sub BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
WriteOffset
(src)
ReadBinaryArray
ReadOffset
Size
コピー元となるバイナリ配列
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
←
▼
▲
Sub BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
←
▼
▲
←
▼
▲
<BinaryArray size="6">
FF FE 6F 30 80 30
</BinaryArray>
出力例:
(src)
←
▼
▲
ダウンロード
txt2bintxt.exe は、VBScript で、一部がバイナリになっているテキストファイルを
作成できるようにする変換ツールです。
f.WriteLine "123"
f.WriteLine Chr(&hFF)+"EF BB BF 0D 0A"
f.WriteLine "123"
バイナリになっている行は、行頭に Chr(&hFF) を出力してください。
31 32 33 0D 0A
EF BB BF 0D 0A
31 32 33 0D 0A
こうして出力したファイルを、in.txt として、
txt2bintxt.exe in.txt out.txt
を実行すると、out.txt は次のようになります。
out.txt (バイナリ表現)
out.txt (テキスト表現)
123
・ソ
123
EF BB BF 0D 0A
EF BB BF 0D 0A
・ソ
EF BB BF は、UTF-8 の BOM です。
→ txt2bintxt.zip
不要になった入力ファイル(in.txt) は、別途削除してください。
関連
BOM 付きテキストファイル
バイナリ・ファイル・アクセス