ファイル数がすくなければ、手作業でするけど、ファイル数が多いのファイルが
サブディレクトリにわたるので、作ってみた。
諸般の事情により、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 件のコメント:
コメントを投稿