// ファイルの仕様 // [Index.save] // 0. "MCAS_Index_x.x.x" // 1. "null"(予約) // 2. 使用済みのインデックスの最大値 // 3. "null"(予約) // 4. "EOH"(ヘッダー終了) // 5. ファイルパス(絶対パス) // 6. インデックス(1以上のint) // 7. 前回のバックアップ時間 // 8. 前回のバックアップファイルの更新日時 // 9. "null"(予約) // 10.ファイルパス(絶対パス) // 11.インデックス(1以上のint) // 12.前回のバックアップ時間 // 13.前回のバックアップファイルの更新日時 // 14."null"(予約) /// <summary> /// Indexファイルを作成(更新)します。既に存在する場合は上書きします。 /// </summary> /// <param name="IndexList">Indexリスト</param> /// <param name="Header">Indexファイルのヘッダー</param> /// <returns>成功:true、失敗:false</returns> public static bool CreateIndexFile(List <Index> IndexList, IndexHeader Header) { var Strings = new List <string>(); // ヘッダを作成 Strings.Add(Header.MCAS_Ver); Strings.Add("null"); Strings.Add(Header.MaxIndex.ToString()); Strings.Add("null"); Strings.Add("EOH"); // IndexListがnullならファイルのみ作成 if (IndexList != null) { for (int i = 0; i < IndexList.Count; i++) { Strings.Add(IndexList[i].FilePath); Strings.Add(IndexList[i].IndexNum.ToString()); Strings.Add(IndexList[i].LastBackupTime.ToString()); Strings.Add(IndexList[i].LastBackupfileTime.ToString()); Strings.Add("null"); } } TextIO.WriteStrings(Define.IndexFile_Path, Strings, false); return(true); }
/// <summary> /// Indexファイル読み込み、IndexのListへ格納します。 /// </summary> /// <param name="Header">Indexファイルのヘッダー</param> /// <returns>Indexファイルの読み込み結果(失敗:null)</returns> public static List <Index> ReadIndexfile(out IndexHeader Header) { var IndexList = new List <Index>(); Header = new IndexHeader(); var IndexFile = TextIO.ReadStrings(Define.IndexFile_Path); int i = 0; // ヘッダー解析 Header.MCAS_Ver = IndexFile[0]; if (Header.MCAS_Ver != "MCAS_Index_" + Define.MCAS_Version) { ConsoleIO.WriteError("Indexファイルのバージョンが一致しません。"); return(null); } if (!int.TryParse(IndexFile[2], out Header.MaxIndex)) { ConsoleIO.WriteError("Indexファイルのインデックスの最大値の読み込みに失敗しました。"); return(null); } // EOH の要素を検索し、それを次の要素番号にセット i = 3; while (IndexFile[i] != "EOH") { i++; } i++; for (; i < IndexFile.Count; i += 5) { var OneIndex = new Index(); OneIndex.FilePath = IndexFile[i]; if (!int.TryParse(IndexFile[i + 1], out OneIndex.IndexNum)) { OneIndex.LastBackupTime = Header.MaxIndex + 1; Header.MaxIndex++; ConsoleIO.WriteWarning("Indexファイルの" + IndexFile[i] + "のインデックスの読み込みに失敗しました。"); } if (!long.TryParse(IndexFile[i + 2], out OneIndex.LastBackupTime)) { OneIndex.LastBackupTime = 0; ConsoleIO.WriteWarning("Indexファイルの" + IndexFile[i] + "の前回のバックアップ時間の読み込みに失敗しました。"); } if (!long.TryParse(IndexFile[i + 3], out OneIndex.LastBackupfileTime)) { OneIndex.LastBackupTime = 0; ConsoleIO.WriteWarning("Indexファイルの" + IndexFile[i] + "の前回のバックアップファイルの更新日時の読み込みに失敗しました。"); } IndexList.Add(OneIndex); } /* * List<string> IndexStrings = TextIO.ReadStrings(Define.IndexFilePath); * List<Index> IndexList; * for (int i = 0; i < IndexStrings.Count; i++) * { * Index * IndexList[i].FilePath = IndexStrings[i]; * if(!(long.TryParse(IndexStrings[i + 1], out IndexList[i].LastBackupTime))) * { * IndexList[i].LastBackupTime = 0; * ConsoleIO.WriteWarning("Warning: Indexファイルの" + IndexStrings[i] + "の前回のバックアップ時間の読み込みに失敗しました。"); * } * if(!(long.TryParse(IndexStrings[i + 2], out IndexList[i].LastBackupfileTime))) * { * IndexList[i].LastBackupTime = 0; * ConsoleIO.WriteWarning("Warning: Indexファイルの" + IndexStrings[i] + "の前回のバックアップファイルの更新日時の読み込みに失敗しました。"); * } * } */ return(IndexList); }
/// <summary> /// プログラム起動時に呼び出し、有効なIndexを返します。 /// </summary> /// <param name="Header">Indexファイルのヘッダー</param> /// <param name="IndexList">無効なIndex</param> /// <returns>有効なIndex</returns> static List <Index> StartProgram(out IndexHeader Header, out List <Index> IndexList) { Header = new IndexHeader(); IndexList = new List <Index>(); ConsoleIO.WriteLine("FilePathファイルの確認中…"); if (!File.Exists(Define.FilePathFile_Path)) { ConsoleIO.WriteError("FilePathファイルが存在しません。\n" + "FilePath.txt にオートセーブ対象フォルダ名を1行に1つ記述してください。\n" + @"例:C:\Users\{ユーザー名}\AppData\Roaming\.minecraft\1.7.10\world"); TextIO.WriteStrings(Define.FilePathFile_Path, ""); Console.ReadLine(); Environment.Exit(0); } List <string> WorldsPath = FilePathFile.ReadFile_List(Define.FilePathFile_Path); ConsoleIO.WriteLine(WorldsPath.Count + " 個のファイルパスを読み取りました。"); for (int i = 0; i < WorldsPath.Count; i++) { ConsoleIO.WriteLine("→ " + WorldsPath[i]); } ConsoleIO.WriteLine("インデックスファイルの読み込み中…"); // 現時点でバックアップされているファイルのインデックスの最大値を検索 int MaxIndex = 0; //backupフォルダがない場合、新規作成 if (!Directory.Exists(Define.BackupDirectory)) { Directory.CreateDirectory(Define.BackupDirectory); } else { int[] Indexes = Backup.SearchUsedIndex(); if (Indexes.Length != 0) { for (int i = 0; i < Indexes.Length; i++) { if (MaxIndex < Indexes[i]) { MaxIndex = Indexes[i]; } } } } // Indexファイルが存在しない場合、WorldsPathを用いて新規作成 if (!File.Exists(Define.IndexFile_Path)) { ConsoleIO.WriteLine("インデックスファイルが存在しないので新規作成します。"); IndexFile.CreateIndexFile(WorldsPath, MaxIndex); } IndexList = IndexFile.ReadIndexfile(out Header); if (IndexList == null) { ConsoleIO.WriteError("Indexファイルが異常です。初期化しますか?"); ConsoleIO.WriteLine("y/N"); if (Console.ReadLine() == "y") { ConsoleIO.WriteLine("(入力文字:y)"); IndexFile.CreateIndexFile(WorldsPath, MaxIndex); } ConsoleIO.WriteLine("(入力文字:y以外)"); IndexList = IndexFile.ReadIndexfile(out Header); if (IndexList == null) { ConsoleIO.WriteError("Indexファイルの新規作成に失敗しました。"); Environment.Exit(0); } } ConsoleIO.WriteLine("Indexファイルの内容とFilePathファイルの内容の一致を確認中…"); var ActiveIndex = IndexFile.ComparisonOfWorldPathFile(ref IndexList, WorldsPath, ref Header.MaxIndex, out int NewIndexNum); ConsoleIO.WriteLine("インデックスファイルの読み込み成功"); ConsoleIO.WriteLine(NewIndexNum + " 個の新しいワールドデータ"); IndexFile.CreateIndexFile(IndexList, ActiveIndex, Header); return(ActiveIndex); }