static public void convertPrefix(string name) { if (System.IO.Directory.Exists(name)) { { // dir part string current = System.IO.Directory.GetCurrentDirectory(); string[] dirs = System.IO.Directory.GetDirectories(name); foreach (string dir in dirs) { if (IOController.validDirectory(dir)) { convertPrefix(dir); } } } { // file part string dname = System.IO.Path.GetFileName(name); dname = dname.ToLower(); if (dname == Path.Data.DialogDirectoryName || dname == Path.Data.MessageDirectoryName) { string[] files = System.IO.Directory.GetFiles(name); string mod = Path.Data.ModifiedDirectory; foreach (string file in files) { if (IOController.validDlgMesFile(file)) { int pos = file.IndexOf(mod); string outfile = file.Substring(pos + mod.Length); File prefix = new File(); prefix.open(file, false); prefix.addPrefixFileNumber(); //prefix.save( tempname ); prefix.save(Path.Data.TemporaryDirectory + outfile); // procは待機しないとデッドロックというより共有アクセス違反を起こす可能性大 // まともに動いても読み書きのタイミング次第では書き終わらないうちに前のファイルを誤読するはず // マルチで動いているのを確認 // tempディレクトリに一旦全部バリバリ書き出したほうが早いのかなあ //runConvertProcess( tempname, outfile, true ); runConvertProcess(Path.Data.TemporaryDirectory + outfile, Path.Data.ConvertedDirectory + outfile, false); } MainForm.incrementProgressBar(); } } } } }
void ConvertAddingPrefix_Click(object sender, EventArgs e) { // この前に開いているタブのセーブの確認 if (preConvertSave() == false) { return; } // conv\Arcanum\の中身があれば掃除する // tempとかconv指定じゃダメなん? IOController.deleteDirectory(Path.Data.TemporaryDirectory + Path.Data.BaseDirectory); IOController.deleteDirectory(Path.Data.ConvertedDirectory + Path.Data.BaseDirectory); setStatus("コンバート開始..."); // prefix // editorのタブの表示は変更したくないから開き直す // 一旦tempに出力 // tempからconvに // 分けないと、通常コンバート時にファイルがたまるな… // あるいはコンバート前に一旦convを掃除するか // あと重いので諸々が更新されない そろそろプログレスバーを検討。できればマルチスレッドでもいいが System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); initializeProgressBar(IOController.getNumFiles(Path.Data.BaseDirectory) + IOController.getNumFiles(Path.Data.ModifiedDirectory)); Convert.convertPrefixOriginal(Path.Data.BaseDirectory); Convert.convertPrefix(Path.Data.ModifiedDirectory); watch.Stop(); completeProgressBar(); addStatus("完了" + " (" + watch.ElapsedMilliseconds + "ms)"); // ゴミ処理 IOController.deleteDirectory(Path.Data.TemporaryDirectory); }
public static string exists(string path, string id, bool female) { // ファイル名、頭5桁の数字 if (IOController.validDlgMesFile(path)) { string file = System.IO.Path.GetFileNameWithoutExtension(path); if (file.Length > 5) { string dir = file.Substring(0, 5); // 数かどうかもチェックした方が良いが // slide.mesの音声再生があるが、あれは構造が異なる string speech = Path.Data.ModuleDirectory + @"Sound\Speech\" + dir + Path.Backslash; if (System.IO.Directory.Exists(speech)) { string prefix = @"v"; string m = @"_m"; string f = @"_f"; string ext = Path.Ext.SpeechExtention; // 多分ありえないだろうが、呼び出し元で符号とっておくこと string name = prefix + id; if (female) { string fpath = speech + name + f + ext; if (System.IO.File.Exists(fpath)) { return(fpath); } } string mpath = speech + name + m + ext; if (System.IO.File.Exists(mpath)) { return(mpath); } } } } return(null); }
static public void convert(string name) { if (System.IO.Directory.Exists(name)) { { // dir part string current = System.IO.Directory.GetCurrentDirectory(); string[] dirs = System.IO.Directory.GetDirectories(name); foreach (string dir in dirs) { if (IOController.validDirectory(dir)) { convert(dir); } } } { // file part string dname = System.IO.Path.GetFileName(name); dname = dname.ToLower(); if (dname == Path.Data.DialogDirectoryName || dname == Path.Data.MessageDirectoryName) { string[] files = System.IO.Directory.GetFiles(name); string mod = Path.Data.ModifiedDirectory; foreach (string file in files) { if (IOController.validDlgMesFile(file)) { int pos = file.IndexOf(mod); string outfile = file.Substring(pos + mod.Length); runConvertProcess(file, Path.Data.ConvertedDirectory + outfile, false); } MainForm.incrementProgressBar(); } } } } }
void Convert_Click(object sender, EventArgs e) { if (preConvertSave() == false) { return; } // conv\Arcanum\の中身があれば掃除する // convで消さないのはなんで? IOController.deleteDirectory(Path.Data.ConvertedDirectory + Path.Data.BaseDirectory); setStatus("コンバート開始..."); System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); initializeProgressBar(IOController.getNumFiles(Path.Data.ModifiedDirectory)); Convert.convert(Path.Data.ModifiedDirectory); watch.Stop(); completeProgressBar(); addStatus("完了" + " (" + watch.ElapsedMilliseconds + "ms)"); }
bool createFileTree(TreeNode node, string name) { bool find = false; { // dir part string current = System.IO.Directory.GetCurrentDirectory(); string[] dirs = System.IO.Directory.GetDirectories(name); int num = 0; foreach (string dir in dirs) { if (IOController.validDirectory(dir)) { ++num; } } if (num > 0) { TreeNode[] nodes = new TreeNode[num]; int count = 0; bool adding = false; for (int i = 0; i < dirs.Length; ++i) { // 存在確認したいが、再起なのでpathをつなげていかないと難しいな // あとaddrangeしてもnull混じりだとおちるかもしらんし if (IOController.validDirectory(dirs[i])) { string dir = System.IO.Path.GetFileName(dirs[i]); nodes[count] = new TreeNode(dir); nodes[count].ImageIndex = 0; nodes[count].SelectedImageIndex = 0; bool ret = createFileTree(nodes[count], dirs[i]); if (ret) { find = true; adding = true; } ++count; } } // 中にdlg,mesがあったら追加 if (adding) { node.Nodes.AddRange(nodes); } } } { // file part string[] files = System.IO.Directory.GetFiles(name); int num = 0; foreach (string file in files) { if (IOController.validDlgMesFile(file)) { num++; find = true; } } if (num > 0) { //Uri current = new Uri( Path.convineFullPath( Path.Data.BaseDirectory ) ); //TreeNode[] nodes = new TreeNode[ files.Length ]; TreeNode[] nodes = new TreeNode[num]; int count = 0; for (int i = 0; i < files.Length; ++i) { int icon = 1; if (IOController.validDlgMesFile(files[i])) { nodes[count] = new TreeNode(System.IO.Path.GetFileName(files[i])); string mod = Path.Data.ModifiedDirectory + files[i]; if (System.IO.File.Exists(mod)) { icon = 2; } else { icon = 1; } nodes[count].ImageIndex = icon; nodes[count].SelectedImageIndex = icon; ++count; } #if false nodes[i] = new TreeNode(System.IO.Path.GetFileName(files[i])); // 本当は進捗でやりたいのだが int icon = 1; // debug //File file = new File(); switch (ext.ToLower()) { case Path.Ext.MessageExtention: //icon = 1; //file.open( files[ i ], true ); //file.save( files[ i ] ); //System.Console.WriteLine( "|-" ); //System.Console.WriteLine( "| " + nodes[ i ].Text + " || || " ); //System.Console.WriteLine( "**" + nodes[ i ].Text ); //System.Console.WriteLine( " \"" + nodes[ i ].Text + "\" => \"" + System.IO.Path.GetDirectoryName( files[ i ] ) + "\"," ); find = true; break; case Path.Ext.DialogueExtention: //icon = 2; //file.open( files[ i ], true ); //file.save( files[ i ] ); //System.Console.WriteLine( "|-" ); //System.Console.WriteLine( "| " + nodes[ i ].Text + " || || " ); //System.Console.WriteLine( "**" + nodes[i].Text ); find = true; break; } //Uri uri = current.MakeRelativeUri( new Uri( files[ i ] ) ); //string mod = Path.convineFullPath( Path.Data.ModifiedDirectory + uri.ToString().Replace( '/', '\\' ) ); string mod = Path.Data.ModifiedDirectory + files[i]; if (System.IO.File.Exists(mod)) { icon = 2; } else { icon = 1; } nodes[i].ImageIndex = icon; nodes[i].SelectedImageIndex = icon; #endif } node.Nodes.AddRange(nodes); } else { node.Expand(); } return(find); } }
void Progress_Click(object sender, EventArgs e) { initializeProgressBar(IOController.getNumFiles(@"Arcanum\")); setStatus("翻訳進捗率の算出中..."); System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); // addでlistにでも情報詰めて集計は後にした方が楽かなー string prog = Path.Xml.ProgressFile; ProgressFile pf = new ProgressFile(); if (System.IO.File.Exists(prog)) { pf = xml.Xml.Read <ProgressFile>(prog); } // listのオーダーが気になるけど書いてないので念のためhashにするよ System.Collections.Hashtable ignore = new System.Collections.Hashtable(); foreach (string f in pf.Ignore) { ignore.Add(f, 0); } foreach (string f in pf.Pending) { ignore.Add(f, 0); } List <ProgressCount> progress = new List <ProgressCount>(); calcProgress(Path.Data.BaseDirectory, progress, ignore); string buff = @""; int num = 0; int total = 0; foreach (ProgressCount count in progress) { if (count.Exist) { buff += @"*"; } if (count.Translated < count.Total) { } else { buff += @"+"; } float rate = 0; if (count.Total > 0) { rate = ( float )count.Translated / count.Total; } buff += count.Name + ": " + count.Translated + " / " + count.Total + " (" + rate.ToString("P0") + ")\r\n"; num += count.Translated; total += count.Total; } if (total > 0) { float totalrate = ( float )num / total; buff = "TOTAL: " + num + " / " + total + " (" + totalrate.ToString("P0") + ")\r\n" + buff; string output = @"progress.txt"; using (System.IO.StreamWriter writer = new System.IO.StreamWriter(output, false, System.Text.Encoding.GetEncoding("shift_jis"))) { //writer.AutoFlush = true; // 即時書き込み writer.Write(buff); runEditor(output); } } completeProgressBar(); watch.Stop(); addStatus("完了: progress.txt" + " (" + watch.ElapsedMilliseconds + "ms)"); // 本とかのチェックにひっかかってるなあ // prefix用とは別関数用意しないと }
void calcProgress(string name, List <ProgressCount> progress, System.Collections.Hashtable ignore) { if (System.IO.Directory.Exists(name) == false) { return; } { // dir part string current = System.IO.Directory.GetCurrentDirectory(); string[] dirs = System.IO.Directory.GetDirectories(name); foreach (string dir in dirs) { if (IOController.validDirectory(dir)) { calcProgress(dir, progress, ignore); } } } { // file part string dname = System.IO.Path.GetFileName(name); dname = dname.ToLower(); if (dname == Path.Data.DialogDirectoryName || dname == Path.Data.MessageDirectoryName) { string[] files = System.IO.Directory.GetFiles(name); foreach (string file in files) { // 除外ファイル if (IOController.validDlgMesFile(file) && ignore.ContainsKey(file) == false) { File ori = new File(); ori.open(file, true); int num = 0; int idnum = ori.IDs.Count; string modpath = Path.Data.ModifiedDirectory + file; bool exist = System.IO.File.Exists(modpath); if (exist) { File mod = new File(); mod.open(modpath, false); int count = 0; // compair for (int i = 0; i < idnum; ++i) { string id = ori.IDs[i] as string; if (id != null) { File.Chunk oc = ori.Chunks[id] as File.Chunk; File.Chunk mc = mod.Chunks[id] as File.Chunk; if (oc != null && mc != null) { // この比較回数を削りたい if (ori.Type == File.FileType.MES) { File.Node omes = oc.Message; File.Node mmes = mc.Message; if (File.checkAvailable(omes.Original)) { ++count; if (omes.Original.CompareTo(mmes.Modify) != 0) { ++num; } } else { //++num; } } else { File.Node omale = oc.MaleLine; File.Node ofemale = oc.FemaleLine; File.Node mmale = mc.MaleLine; File.Node mfemale = mc.FemaleLine; // 二つあるしどういう条件にしようかなと 0.5? // 空はどうするかね // ある程度除外しないとあれだが、その辺はしょうがないのかねえ // だが[E:]みたいなのは、別ファイル参照なので除外してもいいかも // 男女別でカウント if (File.checkAvailable(omale.Original)) { if (omale.Original.CompareTo(mmale.Modify) != 0) { if (File.checkAvailable(ofemale.Original)) { ++count; if (ofemale.Original.CompareTo(mfemale.Modify) != 0) { ++num; } } else { //++num; } } } if (File.checkAvailable(ofemale.Original)) { ++count; if (ofemale.Original.CompareTo(mfemale.Modify) != 0) { ++num; } } else { //++num; } } } } } idnum = count; #if false if (num < idnum) { System.Console.WriteLine("\t" + modpath + ": " + num + " / " + idnum); } else { System.Console.WriteLine(modpath + ": " + num + " / " + idnum); } #endif } else { int count = 0; for (int i = 0; i < idnum; ++i) { string id = ori.IDs[i] as string; if (id != null) { File.Chunk oc = ori.Chunks[id] as File.Chunk; if (oc != null) { // この比較回数を削りたいのう if (ori.Type == File.FileType.MES) { File.Node omes = oc.Message; if (File.checkAvailable(omes.Original)) { ++count; } } else { File.Node omale = oc.MaleLine; File.Node ofemale = oc.FemaleLine; // 二つあるしどういう条件にしようかなと 0.5? // 空はどうするかね // ある程度除外しないとあれだが、その辺はしょうがないのかねえ // だが[E:]みたいなのは、別ファイル参照なので除外してもいいかも // 男女別でカウント if (File.checkAvailable(omale.Original)) { ++count; } if (File.checkAvailable(ofemale.Original)) { ++count; } #if false if (File.checkAvailable(omale.Original) || File.checkAvailable(ofemale.Original)) { ++count; } #endif } } } } idnum = count; } progress.Add(new ProgressCount(file, num, idnum, exist)); } else { //System.Console.WriteLine( "invalid format:" + file ); } incrementProgressBar(); } } } }