ファイル数がすくなければ、手作業でするけど、ファイル数が多いのファイルが
サブディレクトリにわたるので、作ってみた。
諸般の事情により、Delphi2007で作ったので、UTF8への変換にはjclUnicodeの
TWideStringList、ファイルの走査にはJclFileUtilsのTJclFileEnumeratorを利用した。
(変換元ファイルのディレクトリ、変換先のディレクトリの指定にJvclの TJvDirectoryEdit
を使用した。)
以下ソースコード。
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,JclStrings, JclFileUtils, StdCtrls, Mask, JvExMask, JvToolEdit,jclUnicode;
- type
- TForm1 = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- JvDirectoryEdit1: TJvDirectoryEdit;
- JvDirectoryEdit2: TJvDirectoryEdit;
- Button1: TButton;
- Memo1: TMemo;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- FFileEnumerator: TJclFileEnumerator;
- FDirCount: Integer;
- FTaskID: TFileSearchTaskID;
- FT0: TDateTime;
- procedure DirectoryEntered(const Directory: string);
- procedure AddFile(const Directory: string; const FileInfo: TSearchRec);
- procedure TaskDone(const ID: TFileSearchTaskID; const Aborted: Boolean);
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- uses Types,StrUtils, VBLikeString;
- {$R *.dfm}
- { TForm1 }
- procedure TForm1.AddFile(const Directory: string; const FileInfo: TSearchRec);
- var
- SourceFileName,TargetFileName : String;
- TargetDir : String;
- SourceText : TStringList;
- TargetText : TWideStringList;
- LineCount : Integer;
- WorkStrings : TStringDynArray;
- //RevArray : Array of String;
- RevisionString : String;
- IsHeaderArea : Boolean;
- begin
- SourceFileName := Directory + FileInfo.Name;
- //変換後ファイルの書き込み先フォルダは、元ファイルのフルパスの変換元フォルダに指定した
- //文字列を変換後に指定したフォルダに置換すれば良い
- TargetFileName := ReplaceText(SourceFileName,JvDirectoryEdit1.Text,JvDirectoryEdit2.Text);
- TargetDir := ExtractFileDir(TargetFileName);
- //ディレクトリがなければ作成する
- if not(DirectoryExists(TargetDir)) then ForceDirectories(TargetDir);
- SourceText := TStringList.Create;
- try
- SourceText.LoadFromFile(SourceFileName);
- TargetText := TWideStringList.Create;
- try
- //TargetText.Text := ReplaceStr(SourceText.Text,'@CRLF',sLineBreak);
- TargetText.Text := SourceText.Text;
- TargetText.SaveUnicode := true;
- TargetText.SaveFormat := sfUTF8;
- TargetText.SaveToFile(TargetFileName);
- finally
- TargetText.Free;
- end;
- finally
- SourceText.Free;
- end;
- Memo1.Lines.Add(SourceFileName);
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- RootDirectories: TStrings;
- begin
- FFileEnumerator.SearchOption[fsLastChangeAfter] := false;
- FFileEnumerator.SearchOption[fsLastChangeBefore] := false;
- RootDirectories := TStringList.Create;
- try
- StrToStrings(JvDirectoryEdit1.Text, DirSeparator, RootDirectories, False);
- FFileEnumerator.RootDirectories := RootDirectories;
- finally
- RootDirectories.Free;
- end;
- FFileEnumerator.FileMask := '*.c;*.h';
- FFileEnumerator.SearchOption[fsMinSize] := false;
- FFileEnumerator.SearchOption[fsMaxSize] := false;
- FFileEnumerator.IncludeSubDirectories := true;
- FFileEnumerator.IncludeHiddenSubDirectories := true;
- FFileEnumerator.CaseSensitiveSearch := false;
- FDirCount := 0;
- FT0 := Now;
- FTaskID := FFileEnumerator.ForEach(AddFile);
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- FFileEnumerator.StopTask(FTaskID);
- end;
- procedure TForm1.DirectoryEntered(const Directory: string);
- begin
- Inc(FDirCount);
- end;
- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- FFileEnumerator.Free;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- FFileEnumerator := TJclFileEnumerator.Create;
- FFileEnumerator.OnEnterDirectory := DirectoryEntered;
- FFileEnumerator.OnTerminateTask := TaskDone;
- end;
- procedure TForm1.TaskDone(const ID: TFileSearchTaskID; const Aborted: Boolean);
- begin
- //
- end;
- end.
TJclFileEnumeratorは、ファイル検索の条件を設定したうえで、検索条件に該当するファイルが
見つかった場合に呼び出すメソッドを指定してForEcahメソッドを実行すれば、都度、指定した
メソッドを呼び出してくれるので、ForEachに指定しメソッドにSJIS→UTF8の変換処理を
書けばよい。(ソース上ではAddFile)
TStringListを使ってファイルを読み込み、そのテキストをTWideStringListに
渡して、 をTWideStringListでUTF-8を指定して保存することにより、UTF-8変換を
実施した。(このへんは、Delphi 2009以降ならもっとスマートにできる思う。)
0 件のコメント:
コメントを投稿