(for Internet Explorer)
Function  ReadFileInTag( Path as string, StartOfText as string, EndOfText as string ) as string
テキストファイルの中にある指定の開始タグと終了タグの間にあるテキストを読み込みます。
【引数】
Path
StartOfText
読み込むテキストファイルのパス
読み込む範囲の先頭にあるタグ(テキスト)、または Empty(=先頭から)
タグの間のテキストファイルの内容。 タグ、および、先頭と末尾の改行は除く
読み込む範囲の末尾にあるタグ(テキスト)、または Empty(=末尾まで)
返り値
EndOfText
読み込みサンプル
StartOfText = "<Tag>", EndOfText = "</Tag>" とします。
ファイル
返り値
abc<Tag>123</Tag>def
123
abc<Tag>
123
456
</Tag>def
123
456
(456の後に改行なし)
サンプル
Dim  text

CreateFile  "index.html", "abc<P class=""new"">123</P>def"
text = ReadFileInTag( "index.html", "<P class=""new"">", "</P>" ) : Assert  text = "123"

CreateFile  "index.html", "abc<P>def"
text = ReadFileInTag( "index.html", "<P>", Empty ) : Assert  text = "def"
text = ReadFileInTag( "index.html", Empty, "<P>" ) : Assert  text = "abc"
→ T_File.vbs # [T_ReadFileInTag]
テスト
関連
(src)
Function  ReadAll( FileStream as TextStream ) as string
テキストファイルをすべてリードします。
【引数】
FileStream
返り値
開いている読み込むファイル
最後までリードしたテキスト
と異なり、ファイルサイズが 0 のときでも、エラーになりません。
TextStream::ReadAll
(src)
関連
Function  CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
text
作成するテキストファイルのパス
テキストファイルの内容
(src)
末尾に改行は入りません。
サンプル: カレントフォルダに a.txt ファイルを作る
CreateFile  "a.txt", "ABC"
返り値
作成したテキストファイルの絶対パス
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
start  CreateFile( "*.xml", obj.xml )
obj
サンプル:  obj の xml プロパティを、テンポラリファイルに出力して開く
関連
を使うと、テキストファイルのフォーマットを指定できます。
→ T_File.vbs [T_CreateFile]
テスト
を使うと、内部で
を使います。
参考
→ FileT_create (clib)
mini (src)
→ T_File.vbs [T_CreateFile_Err]
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
[WARNING] Out of Writable, see "Out of Writable" in vbslib manual.
 "C:\home\scriptlib\vbslib_new\_src\Test\vbslib_test\T_Writable\work2"
スクリプトが想定していない場所に、ファイルを出力しようとしたとき、出力してよいかユーザに
確認を取ります。
コマンドプロンプトへの出力例:
確認ウィンドウ:
を使ってください。
vbslib を使ったスクリプトは、ダブルクリックした .vbs ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。

この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
デバッガでスクリプトを起動し、Out of Writable の警告で、プログラムの終了やキャンセルを
選ぶと、例外によりブレークします。
      Err.Raise  E_OutOfWritable,, "Out of Writable """ & CheckPath & """"
      ' Watch  g_CurrentWritables.CurrentPathes and CheckPath
g_CurrentWritables.CurrentPathes や CheckPath をウォッチウィンドウでチェックしてください。
コールツリー
mkdir など
g_AppKey.CheckWritable
m_Key.CheckWritable
g_CurrentWritables.CheckWritable
m_Key.CheckPlusWritable
"...\*" 以外のチェック
"...\*" で追加されたものと比較
m_Key.Ask
警告の表示
m_PlusWritables( UBound( m_PlusWritables ) ) = abs_path
Writable を追加
隠しキーのメソッド
公開キーのメソッド
テスト
グローバル変数のデストラクタでファイル操作をすると、メイン関数で作成した Writables
オブジェクトが削除された後なので、必ず警告が発生します。
If IsEmpty( abs_path ) Then  Exit Sub
Writable の中なので OK
AppKey.NewWritable
Writables::SetPathes
m_Pathes( UBound( m_Pathes ) ) = g_TempFile.m_FolderPath + "\"
m_Pathes(i) = abs_path + "\"
Writable の登録
テンポラリを Writable に登録
g_CurrentWritables.AskFileAccess
Writables::Enable
WritablesStack::PushPathes
CurrentWritables::PushPathes
m_PathesStack.Push
Writable を有効にする
をばらまいてください。
Writable の状況を確認したいときは、
Function  AppKeyClass::NewWritable( Pathes as variant ) as Writables
Sub  Main( Opt, AppKey )
  Set w_= AppKey.NewWritable( "." ).Enable()
    '// 書き込み可能な範囲
  w_ = Empty  '// これを書かないときは、関数が終わるまでが範囲
End Sub
サンプル1: カレントフォルダを書き込み可能にする
サンプル: 後で out フォルダを書き込み可能にする
Sub  Main( Opt, AppKey )
  Set wr = AppKey.NewWritable( "out" )

  sub2  wr
End Sub

Sub  sub2( wr )
  Set w_ = wr.Enable()
    '// "out" に書き込み可能な範囲
End Sub
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
返り値
Writable 設定オブジェクト
通常は、サンプル1のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
AppKey は、なるべく他の関数に渡さないようにしてください。
Sub  Main( Opt, AppKey )
  Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
    '// 書き込み可能な範囲
End Sub
サンプル: 複数のフォルダを書き込み可能にする
AppKeyClass は、
NewWritable( "." )
(src)
。文字列、または文字列の配列
関連
サンプル: デスクトップに新規フォルダの作成を可能にし、新規フォルダの中は書き込み
可能にする。 新規フォルダを作成することができるフォルダのパスの後に \* を指定して
ください。
Sub  Main( Opt, AppKey )
  desktop = g_sh.SpecialFolders( "Desktop" )
  Set w_= AppKey.NewWritable( desktop+"\*" ).Enable()
  mkdir  desktop+"\New Folder"
    '// 書き込み可能な範囲
  w_ = Empty  '// これを書かないときは、関数が終わるまでが範囲
End Sub
Pathes に指定するパスの最後に "\*" があると、新規フォルダの作成を可能にし、
新規フォルダの中は書き込み可能にします。 "C:\folder1\*" とすると、C:\folder1
にファイルを作成できませんが、フォルダは作成できます。
すでに C:\folder1 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
が出ないようになります。
本関数を正しく使えば、
テスト
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
に F_IgnoreIfWarn を指定して、
呼び出してください。
→ T_Writable フォルダ
を使います。
の第2引数である AppKey のクラスです。
Sub  main2( Opt, AppKey )
  Dim  writable : writable = m.GetWritable
  If not AppKey.InPath( writable, "..\out" ) Then  Error

  Dim w_ : Set w_= AppKey.NewWritable( writable ).Enable()
    '// 書き込み可能な範囲
  w_ = Empty
End Sub
使用サンプル:
Function  ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
writable
writable
writable
定義サンプル:
Class  ClassA
  Public Function  GetWritable()
    GetWritable = Array( "Work" )
  End Function
End Class
Function  AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
サンプル:
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
EnablePath
パスの配列
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル:
vbslib.vbs
(src)
(src)
Sub  AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
【引数】
Path
Opt
チェックするパス
Empty または c.ForMkDir (*1)
されているかどうかチェックします。
(*1)
Path が、Enable (Writables) されていなかったら、
が出ます。
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー(Path より長いパス)だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
g_AppKey.CheckWritable  path, Empty
サンプル
Sub  AppKeyClass::Watch()
Writable の状態を echo 出力します。
Function  Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
から取得できます。
返り値の WritableStack オブジェクトが、どこからも参照されなくなったら、書き込み
可能では無くなります。
1つ目の WritableStack が存在するときに、2つ目の Writable::Enable をすると、ネスト
して、2つ目の WritableStack のみ有効になります。 2つ目の WritableStack が参照
されなくなったら、1つ目の WritableStack が有効になります。
Set  w1 = AppKey.NewWritable( "out1" )
Set  w2 = AppKey.NewWritable( "out2" )

Set  w1_ = w1.Enable()

  '// "out1" が書き込み可能

Set  w2_ = w2.Enable()

  '// "out2" が書き込み可能

w2_ = Empty

  '// "out1" が書き込み可能

w1_ = Empty
(src)
関連
  Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
Sub  SetWritableMode( Mode as integer )
で指定していないフォルダにライトしようとしたときの動きを設定します。
SetWritableMode  F_ErrIfWarn
サンプル
ユーザにライトしていいかどうかを確認します(デフォルト)
E_OutOfWritable エラーにします
警告を無視します(AppKeyClass::SetWritableMode でのみ指定可能)
(src)
  AppKey.SetWritableMode  F_IgnoreIfWarn
  Set w_=AppKey.NewWritable( env("%ProgramFiles%")+"\SampleApp" ).Enable()
  SetWritableMode  F_AskIfWarn
Sub  AppKeyClass::SetWritableMode( Mode as integer )
関連
サンプル: F_IgnoreIfWarn には、AppKey が必要
Function  OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。(リード用=ファイルから入力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、
FileSystemObject::OpenTextFile
エラーメッセージに Path が付きます。
(src)
  Set c = g_VBS_Lib
  Set args = WScript.Arguments.Unnamed

  If args.Count = 0 Then
    path = InputPath( "ファイルのパス >", c.CheckFileExists )
  Else
    path = args(0)
  End If

  Set file = OpenForRead( path )
  Do Until  file.AtEndOfStream
    line = file.ReadLine()
    '// If InStr( line, "DEBUG" ) > 0 Then  echo  line
  Loop
  file = Empty
または
になります。
→ T_File.vbs # [T_OpenFile]
関連
テスト
既定の文字コードを指定します
文字コードを指定するときは、
を使ってください。
ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わなくても自動的に文字コード
を判定して、正しく読み込みます。
  Set cs = new_TextFileCharSetStack( "EUC-JP" )
  Set file = OpenForRead( args(0) )
  cs = Empty
  Do Until  file.AtEndOfStream
    line = file.ReadLine()
  Loop
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
ファイルの文字コードを判定するために、ファイルの先頭にある BOM を読みます。
【引数】
Path
文字コードを判定するファイルのパス
Function  ReadUnicodeFileBOM( Path as string ) as integer
返り値
BOM の文字コード。 c.UTF_8, c.Unicode, c.No_BOM, Empty(ファイルが無い)
(src)
関連
サンプル
  Dim  cs : Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( "File1.txt" ) )
  CreateFile  "File1.txt", "abc"
同じ文字コードを使ってファイルを作成する
File1.txt
テスト
→ T_File.vbs # [T_ReadUnicodeFileBOM]
BOM が無いときは、OS に設定された地域の標準形式になります。
ただし、
XML宣言 (?xml)
→ 文字エンコーディングの指定方法
MIME
や HTML の charset によって、文字コードが指定される場合もあり
ます。 その場合、
を使って開きなおしてください。
ファイルの先頭行を読んで、改行文字の種類を返します。
【引数】
Path
改行文字の種類を判定するファイルのパス
Function  ReadLineSeparator( Path as string ) as integer
返り値
vbCRLF または vbLF
関連
サンプル
  f.LineSeparator = ReadLineSeparator( "File1.txt" )
(src)
テスト
→ T_File.vbs # [T_ReadLineSeparator]
Function  OpenForWrite( Path as string, Flags as integer ) as TextStream
テキストファイルを開きます。(ライト用=ファイルへ出力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、エラーメッセージに Path が付きます。
FileSystemObject::OpenTextFile
  Dim  file

  Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
  Set file = OpenForWrite( "a.txt", Empty )
  file.WriteLine  "abc"
  file = Empty
サンプル
c.Unicode
Flags 引数
Empty または 次の値
Unicode 形式ファイルにします。 指定しないときは、
new_TextFileCharSetStack で指定した既定の文字コードになります。
(src)
Flags
Empty、またはオプション(下記)
c.Append
追記します。
Shift-JIS, Unicode, UTF-8(BOMあり) のときは、文字コードを指定しなくても、
元のファイルと同じ文字コードになります。
関連
→ T_File.vbs [T_OpenForWrite]
テスト
a.txt
を使うと、その他のフォーマットも指定できます。
次の値と論理和をとることもできます。
文字コードの指定は、次のどれかが指定できます。
c.Shift_JIS
c.UTF_8
c.EUC_JP
BOM 付き UTF-8
Shift-JIS
EUC(JP)
BOM なし UTF-8
c.UTF_8_No_BOM
c は g_VBS_Lib から取得できます。
メソッドを使って、Out of Writable 警告が出ないようにしておいてください。
改行コードの指定は、
を使ってください。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
→ T_File.vbs [T_OpenForWrite_Overwrite]
テキストファイルの内容を書き換えるときは、文字コード(Unicode ファイルのBOM)や改行文字を
を使ってください。
継承する
  Set cs = new_TextFileCharSetStack( "UTF-8" )
  CreateFile  "File1.txt", "abc"
サンプル
"UTF-8"
ファイルの文字コードを指定します。
【引数】
CharSet
ファイルの文字コード, Empty=デフォルト
新規作成時のデフォルトは、"Shift_JIS" です。
CharSet 引数に指定する文字列の大文字小文字は区別しません。
c.Unicode などの数値定数を指定することもできます。
Function  new_TextFileCharSetStack( CharSet as string ) as TextFileCharSetStack
関連
テスト
→ T_File.vbs [T_CreateFile]
(src)
新規作成するときの出力ファイルや、ファイルから読み込むときの文字コードを指定
します。 返り値のオブジェクトが削除されたら、指定は無効になります。
"UTF-8" は、ファイルの先頭に
BOM
が付きます。 "UTF-8-No-BOM" は付きません。
指定できる値は、レジストリの HKEY_CLASSES_ROOT\MIME\Database\Charset の
サブキーを参照してください。 ただし、"UTF-8-No-BOM" はサブキーにありません。
CharSetの例:
"Shift_JIS", "EUC-JP", "Unicode", "UTF-8", "UTF-8-No-BOM",
"ISO-8859-1", c.Unicode, c.UTF_8, c.UTF_8_No_BOM, c.EUC_JP,
c.Shift_JIS
BOM を付けないときは XML の encoding や HTML の charset などを用いて文字
コードを記述しなければ、多くのプログラムは文字化けを起こします。 一方で、
BOM があるとエラーを起こすプログラムも多くあります。
<?xml version="1.0" encoding="UTF-8"?>
XML の場合
<META http-equiv="content-type" content="text/html; charset=UTF-8"/>
HTML の場合
UTF-8
UTF-8
ファイルの先頭にある BOM を読みます。
XML ファイルの文字コードを指定します。