(for Internet Explorer)
デストラクタから自動的に呼ばれますが、明示的に呼び出すこともできます。
Sub  ReplaceTextFile1::Close()
テキストファイルの内容の変更を完了します。
Sub  SafeFileUpdate( FromTmpFilePath as string, ToFilePath as string )
ファイルを安全に更新します。 上書き移動して、元の内容はゴミ箱に入ります。
【引数】
FromTmpFilePath
ToFilePath
新しい内容が書かれたファイルのパス
更新するファイルのパス
SafeFileUpdate を呼び出している途中で、ファイルの更新やバックアップなどに失敗
したら、エラーが発生しますが、ファイルの内容は、消えることなく、元に戻ります。
ただし、新しい内容が保存できていないので、エラー復帰して、別のディスクに保存
できるようにしてください。
(src)
テスト
→ T_SafeCopy.vbs # [T_SafeFileUpdate]
ファイル:
vbslib.vbs
サンプル
tmp_path = GetTempPath( "new_*.txt" )
CreateFile  tmp_path, "新情報!"
SafeFileUpdate  tmp_path, "FileA.txt"
FileA.txt の内容を、"新情報!" という内容に更新します。
一時的に存在するファイル tmp_path に、新しい内容を出力する必要があります。
SafeFileUpdate を呼び出した後は、tmp_path の場所にファイルは無くなります。
古い内容は、ごみ箱に入ります。
"FileA.txt"
"新情報!"
更新するファイルを直接開いてライトするプログラムの場合、ライトしている途中で、
容量不足になったり、接続できなくなったりしてエラーになると、更新する前の内容
が消えてしまいます。 それだけでなく、更新した後の内容も保存できない可能性が
あります。 その場合、ファイルに格納していた情報がすべて消えてしまいます。
SafeFileUpdate は、そのリスクを回避します。
関連
Sub  ConvertToAbsPath( SrcFilePath as string, DstFilePath as string )
%AbsPath(..\SampleLib)%
テキストファイルの中の相対パスや特殊フォルダのパスを絶対パスに変換してコピーします。
変換前
変換後の例
C:\folder\SampleLib
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
【引数】
SrcFilePath
DstFilePath
変換前のファイルのパス
変換後のファイルのパス(新規作成または上書き)
(src)
%AbsPath(x)% の x に相対パスを記述すると、DstFilePath のファイルが入ったフォルダを相対
パスの基準にした絶対パスに変換されます。 基準を SrcFilePath ではなく DstFilePath にして
いる理由は、1つの SrcFilePath のファイルに対して、複数の場所で使用することができるよう
にするためです。

% を使った環境変数も展開されます。
→ TextFileConvertFormat::Set_
参考
テスト
Unicode ファイルにするときは、次のように設定してから ConvertToAbsPath を呼んでください。
Dim  c : Set c = g_VBS_Lib
Dim  cs : Set cs = new_TextFileCharSetStack( c.Unicode )
ConvertToAbsPath  "ans.txt", "ans_tmp.txt"
%AbsPath(.)%
C:\folder\current
→ T_ConvAbs.vbs # ConvertToAbsPath
参考
  Dim rep, line, cr_lf
  Set rep = StartReplace( "a.txt", GetTempPath("*.txt"), False )
  Do Until rep.r.AtEndOfStream
    SplitLineAndCRLF  rep.r.ReadLine(), line, cr_lf
    line = Replace( line, "Value=0", "Value=1" )
    rep.w.WriteLine  line + cr_lf
  Loop
  rep.Finish
(src)
Function  StartReplace( SrcPath as string, TmpDstPath as string, IsDstWillBeExist as boolean )
             as StartReplaceObj
ファイルの一部を置き換える準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
IsDstWillBeExist
StartReplace を呼び出すと、SrcPath と TmpDstPath のファイルを開きます。
返り値を使って、ファイルにアクセスできます。(下記サンプルを参照)
返り値
コンテキスト
関連
→ T_Replace.vbs # [T_StartReplace]
テスト
改行文字コードは、SrcPath に記述されているものが、そのまま継承されます。 ただし、
が使える環境である必要があります。
また、rep.r 以外のファイルから rep.w にライトするときは、リードするファイルを開くときに、
new_TextFileLineSeparatorStack( get_ADODBConsts().Keep ) が必要です。
改行文字コードについて
ReadLine で取得できる行の末尾には、vbCR や vbLF が付きます。
その他のサンプル
IsDstWillBeExist に g_VBS_Lib.DstIsBackUp を指定すると、TmpDstPath にバックアップを作成し、
SrcPath 置き換えた後の内容が入ります。
IsDstWillBeExist = False のときは、返り値の Finish メソッドを呼び出すと、全てのファイルを閉じ、
TmpDstPath から SrcPath へ、ファイルコピーを行い、TmpDstPath を削除します。
を使って分けることができます。
テキストファイルの一部を置き換えるインターフェース
取得
置き換えようとするファイルのストリーム
一時ファイル、または置き換えた後のファイルのストリーム
Finish
正常に完了したら呼び出す必要がある関数
Class_Terminate
デストラクタ。 Finish または ExitFinish が呼ばれなかったら警告します
ExitFinish  Empty
置き換えをキャンセルします。
Sub  ReplaceTextFile( SrcPath as string, TmpDstPath as string,
       bDstWillBeExist as boolean, ReplaceList as ReplaceItem, Opt as variant )
ファイルの一部を置き換えます。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパス=True, 一時パス=False
bDstWillBeExist
ReplaceList
置き換えるテキスト
Opt
Empty を指定してください
  Dim  reps : new_ReplaceItem_array  reps, 1
  reps(0).Src = "%base%" : reps(0).Dst = g_sh.CurrentDirectory
  ReplaceTextFile  "file.txt", GetTempPath("*.txt"), False, reps, Empty
サンプル:
(src)
1
new_ReplaceItem_array については、
Class  ReplaceItem
  Public  Src
  Public  Dst
End Class
%base%
g_sh.CurrentDirectory
file.txt
→ TextFileConvertFormat::Set_
参考
ver4 で、廃止になりました。  OpenForReplace を使ってください。
Sub  Main( Opt, AppKey )
    Dim  c : Set c = g_VBS_Lib
    Dim  path : path = InputPath( "変換するファイル >", c.CheckFileExists or c.UseArgument1 )
    Dim  w_:Set w_=AppKey.NewWritable( path ).Enable()
    Dim  rep, line, cr_lf

    Set rep = StartReplace( path, GetTempPath("Replace_*.txt"), c.DstIsBackUp )
    Do Until rep.r.AtEndOfStream
        SplitLineAndCRLF  rep.r.ReadLine(), line, cr_lf

        line = "> "+ line

        rep.w.WriteLine  line + cr_lf
    Loop
    rep.Finish

    start  GetEditorCmdLine( path )
End Sub
スクリプト・ファイルに処理をするファイルを直接ドラッグ&ドロップしても、スクリプト・ファイルをダブル・
クリックして開いたウィンドウに処理するファイルをドラッグ&ドロップしても処理ができます。
「line = "> "+ line」 の部分を処理内容に書き換えてお使いください。
Sub  main2( Opt, AppKey )
  Dim  exe_name
  Dim  desktop : desktop = g_sh.SpecialFolders( "Desktop" )
  Dim  rep, line

  Dim w_:Set w_=AppKey.NewWritable( desktop ).Enable()

  '//=== Input exe name
  Do
    exe_name = input( "exe name>" )
    If exist( desktop + "\" + exe_name ) Then
      Raise  1, "すでにデスクトップに " + exe_name + " が存在するため、新規作成できません"
    Else
      Exit Do
    End If
  Loop


  '//=== Make output folder
  mkdir  desktop + "\" + exe_name
  copy  g_vbslib_folder + "*", desktop + "\" + exe_name + "\scriptlib"


  '//=== Make exe_name.c
  Set rep = StartReplace( "files\template.c", _
                desktop + "\" + exe_name + "\" + exe_name + ".c", True )
  Do Until rep.r.AtEndOfStream
    line = rep.r.ReadLine()
    line = Replace( line, "Sample", exe_name )
    rep.w.WriteLine  line
  Loop
  rep.Finish


  '//=== Open output folder
  Setting_openFolder  desktop + "\" + exe_name
End Sub
sample_wizard.vbs
wizard
sample_wizard.vbs
files
template.c
デスクトップに、テンプレート・ファイルを少し加工してフォルダを作成します。
exe name>
と表示されるので、入力すると、
_src\Test\vbslib_test\T_Replace\T_Replace_Sample1 にあります。
Function  StartReplace2( SrcPath as string, MidPath as string, Flags as integer,
               TmpDstPath as string, bDstWillBeExist as boolean ) as StartReplaceObj
F_Txt2BinTxt を指定してください(下記)
ファイルの一部を置き換えて、更にフィルタ処理をするための準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
bDstWillBeExist
返り値
コンテキスト
MidPath
Flags
一時ファイルのパス
StartReplaceObj.w に、Chr(&hFF) から始める行を出力すると、その行はバイナリになり
ます。
→ TextFileConvertFormat::Set_
参考
Sub  PassThroughLineFilters( SrcPath as string, TmpDstPath as string,
       IsDstWillBeExist as boolean, Opt as Empty, FilterArray as array of string )
指定のキーワードを含む行を抽出します。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
IsDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
キーワードの配列
Empty または False (=FilterArray に含まない行を抽出)
FilterArray
Opt
(src)
  PassThroughLineFilters( "a.txt", GetTempPath("*.txt"), False, Empty, _
    Array( "(TRACE)", "(DEBUG)" )
(TRACE) と (DEBUG) を含む行だけにします。
→ T_Replace.vbs # [T_PassThroughLineFilters]
テスト
関連
Sub  SplitLineAndCRLF( LineAndCRLF as string, out_Line as string, out_CRLF as string )
行の本文と、行末の改行文字を分けます。
【引数】
LineAndCRLF
out_Line
改行文字が末尾に含まれている可能性がある文字列
(出力) 改行文字より前の文字列
ファイル:
vbslib
out_CRLF
(出力) 行末の改行文字
(src)
Function  CutCRLF( Line as string )
改行文字を削除します。
【引数】
Line
返り値
改行文字が削除される文字列
改行文字が削除された文字列
ファイル:
vbslib
(src)
→ T_Replace.vbs # [T_CutCRLF]
テスト
Sub  Translate( TranslatorPath as string, FromLanguage as string, ToLanguage as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳します。
【引数】
TranslatorPath
FromLanguage
翻訳ファイル(*.trans)のパス
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
(src)
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>sample1.txt</File>
<File>sample2.c</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP><EN>English</EN></T>
</Translate>
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>sample.txt</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP><EN>English</EN></T>
</Translate>
サンプル
sample.trans (翻訳ファイル)
sample.txt の翻訳前
日本語から英語に変換します。
sample.txt の翻訳後
JapaneseからEnglishに変換します。
サンプル : 複数のファイルを翻訳する
JapaneseToEnglish.trans (翻訳ファイル)
スクリプト
Translate  "sample.trans", "JP", "EN"
スクリプト
Translate  "JapaneseToEnglish.trans", "EN", "JP"
英語 から 日本語 へ
sample1.txt の翻訳後
English から Japanese へ
sample1.txt の翻訳前
sample2.c の翻訳前
sample2.c の翻訳後
French から 日本語 へ
French から Japanese へ
File タグに指定したファイルを翻訳します。
→ T_Translate.vbs # [T_Translate1]
→ T_Translate.vbs # [T_Translate_sth]
テスト
英語に翻訳するときに、英文字以外が残っていたときは、エラーが発生します。
関連
Sub  TranslateTest( TranslatorPath as string, FromLanguage as string, ToLanguage as string,
                    OutFolderPath as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳できるかどうかチェックします。
【引数】
TranslatorPath
FromLanguage
翻訳ファイルのパス
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
OutFolderPath
翻訳後の出力先ファイル・パス。 または "" = 出力しない
(src)
参考
関連
→ T_Translate.vbs # [T_TranslateTest]
テスト
→ T_Translate.vbs # [T_TranslateTest_sth]
Function  CheckEnglishOnly( CheckFolderPath as string, SettingPath as string )
    as ArrayClass<CheckEnglishOnlyFound>
テキスト・ファイルの中に、英文字以外の文字が含まれるファイルを一覧します。
【引数】
CheckFolderPath
SettingPath
調べるフォルダのパス
設定ファイルのパス。または Empty。 設定ファイル
ToolsLib.vbs
モジュール・ファイル:
返り値
英文字以外の文字が含まれるファイルの情報
(src)
  Dim  founds, found, file

  Set founds = CheckEnglishOnly( "FolderA", "SettingForCheckEnglish.ini" )

  For Each file  In founds.Items
    For Each found  In file.NotEnglishItems.Items
      echo  file.Path +"("& found.LineNum  &"): "+ found.NotEnglishText
    Next
  Next
サンプル:
テスト
実行ファイル版
関連
簡易版
サンプル: scriptlib フォルダーをチェックする
→ 3.CheckNotEnglish フォルダー
→ T_CheckEnglishOnly.vbs # [T_CheckEnglishOnly]
Function  new_TranslateToEnglish( DictionaryCsvPath as string ) as TranslateToEnglish
辞書ファイルを使って、ソース・ファイルのコメントを英訳します。
【引数】
DictionaryCsvPath
CSV 形式の辞書ファイルのパス
ToolsLib.vbs
モジュール・ファイル:
(src)
サンプル:
Dim tr : Set tr  = new_TranslateToEnglish( "Text1.txt.trans.csv" )
'// tr.IsReverseTranslate = True
Dim w_:Set w_=AppKey.NewWritable( tr.Writable ).Enable()
tr.Translate
いわゆる英訳ソフトのような、文法解析を行って大きな辞書を引くような翻訳ではありません。
内部では、単純なテキストの置換と、置換後のファイルに含まれる文字が英文字だけかどうか
のチェックをします。 翻訳後に英文字以外の文字が残ったら、TranslateToEnglish::c.
E_NotEnglishChar エラーになります。
英訳処理のサンプル
Text1_trans.csv
Text1.c, %eng%\Text1.c
メイン関数, Main function
サブ関数, Sub function
テスト
#include  <stdio.h>

int  main() { }  // メイン関数
int  sub() { }   // サブ関数
Text1.c
%eng%\Text1.c
#include  <stdio.h>

int  main() { }  // Main function
int  sub() { }   // Sub function
1行目の左は、変換前のファイルパスです。
1行目の右は、変換後のファイルパスです。
1行目は、% % で囲んだ環境変数を指定できます。
1行目の右を省略すると、ファイルの置き換えをします。
2行目以降は、翻訳するキーワードを指定します。
→ TranslateToEnglish フォルダ
キーワード:
関連
→ sample / CheckEnglishOnly
関連
英文字以外が無いか、フォルダ全体をチェックする
Text1.txt.trans.csv
廃止
.IsReverseTranslate
Property  TranslateToEnglish::IsReverseTranslate as boolean
.Writable
Property  TranslateToEnglish::Writable as string
.Translate
Sub  TranslateToEnglish::Translate()
取得
True なら、翻訳する方向を逆に設定します。
EnglishTextPath から NotEnglishTextPath に翻訳します。
デフォルトは False です。
出力ファイルのパス。
AppKey.NewWritable に指定してください。
翻訳を実行します。
Property  TranslateToEnglish::c.E_NotEnglishChar as integer
翻訳後も英文字以外の文字が残っていたときのエラーコード。
.Reverse が呼び出されたときは、このエラーは発生しません。
.NotEnglishTextPath
.EnglishTextPath
Property  TranslateToEnglish::EnglishTextPath as string
英語のテキスト・ファイルのパス。
NotEnglishTextPath と同じパスを指定できます。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
英語以外のテキスト・ファイルのパス。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
Property  TranslateToEnglish::NotEnglishTextPath as string
.DictionaryCsvPath
Property  TranslateToEnglish::DictionaryCsvPath as string
CSV 形式の辞書ファイルのパス。
new_TranslateToEnglish に指定した引数の値と同じです。
廃止
  cd  g_fs.GetParentFolderName( WScript.ScriptFullName )
  Dim  trs, tr, folder, fnames(), fname, w_, step_path, b

  set_ "folder_jp", "C:\FolderA"
  set_ "folder_en", GetAbsPath( "..\folder_en", WScript.ScriptFullName )

  echo_line
  echo  "コメントを英訳します"
  echo  "From: "+ GetVar( "folder_jp" )
  echo  "To:   "+ GetVar( "folder_en" )
  pause


  '//=== 翻訳 CSV ファイルを集める
  Set trs = new ArrayClass
  ExpandWildcard  GetVar( "folder_en" ) +"\*.trans.csv", F_File or F_SubFolder, folder, fnames
  For Each fname in fnames
    step_path = fname : CutLastOf  step_path, ".trans.csv", Empty
    set_ "step", step_path

    trs.Add  new_TranslateToEnglish( folder +"\"+ fname )
  Next


  '//=== 翻訳する。 ただし、翻訳済みファイルがあるとき(英文字以外が無く、新しいとき)は処理しない
  For Each tr  In trs.Items
    b = MakeRule_compare( tr.EnglishTextPath, tr.NotEnglishTextPath )
    If not b Then  b = ( GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty ) > 0 )
    If b Then
      Set w_=AppKey.NewWritable( tr.Writable ).Enable()
      tr.Translate
    End If
  Next
%folder_jp%\%step%, %folder_en%\%step%
日本語, Japanese
翻訳ファイル *.trans.csv を、変換対象のフォルダーと同じ構成で配置して、翻訳します。
翻訳ファイル *.trans.csv
廃止
Function  GetLineNumsExistNotEnglighChar( Path as string, out_LineNums as Array of integer ) as integer
テキスト・ファイルの中に、英文字以外の文字が含まれる行番号の配列を取得します。
【引数】
Path
out_LineNums
テキスト・ファイルのパス
(出力) 英文字以外の文字が含まれる行番号の配列、Empty 指定可
ToolsLib.vbs
モジュール・ファイル:
関連
(src)
返り値
英文字以外の文字が含まれる行数
サンプル:
  Dim tr : Set tr = new_TranslateToEnglish( "Text1.txt.trans.csv" )
  echo  GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty )
  Dim  i, line_nums
  GetLineNumsExistNotEnglighChar  "Text1.txt", line_nums  '//[out] line_nums
  For Each i  In line_nums
    echo  i
  Next
日本語(文字コード256以上)を 2文字として文字数を返します。