/// <summary> /// xmlの内容を全て取得する /// </summary> /// <returns>RodDBModel</returns> private FishDBModel getFishDB(string iRodName) { string xmlFilename = PATH_FISHDB + @"\" + iRodName + ".xml"; try { FishDBModel fishdb = new FishDBModel(iRodName); if (File.Exists(xmlFilename)) { for (int i = 0; i < Constants.FILELOCK_RETRY_COUNT; i++) { try { using (FileStream fs = new FileStream(xmlFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) { XmlSerializer serializer = new XmlSerializer(typeof(FishDBModel)); fishdb = (FishDBModel)serializer.Deserialize(fs); } break; } catch (IOException) { Thread.Sleep(100); continue; } } } return(fishdb); } catch (Exception e) { logger.Fatal("{0}の取得中にエラーが発生しました。", xmlFilename); throw e; } }
/// <summary> /// 魚リストの取得 /// </summary> /// <param name="iRodName">竿名称</param> /// <param name="iZoneName">エリア名称</param> /// <param name="iBaitName">エサ名称</param> /// <returns></returns> public List <FishDBFishModel> SelectFishList(string iRodName, string iZoneName, string iBaitName) { logger.Trace("RodName={0} ZoneName={1} BaitName={2}", iRodName, iZoneName, iBaitName); List <FishDBFishModel> ret = new List <FishDBFishModel>(); FishDBModel fishDB = getFishDB(iRodName); foreach (FishDBFishModel fish in fishDB.Fishes) { bool foundZoneFlg = false; if (iZoneName != string.Empty) { foundZoneFlg = fish.ZoneNames.Contains(iZoneName); } else { foundZoneFlg = true; } bool foundBaitFlg = false; if (iBaitName != string.Empty) { foundBaitFlg = fish.BaitNames.Contains(iBaitName); } else { foundBaitFlg = true; } if (foundZoneFlg && foundBaitFlg) { ret.Add(fish); } } ret.Sort(FishDBFishModel.SortTypeName); return(ret); }
/// <summary> /// 全竿に登録されている魚名を取得する /// </summary> /// <returns>魚名称</returns> public List <string> SelectAllFishName() { List <string> ret = new List <string>(); foreach (string rod in _Rods) { FishDBModel fishDB = getFishDB(rod); foreach (FishDBFishModel fish in fishDB.Fishes) { if (!ret.Contains(fish.FishName)) { ret.Add(fish.FishName); } } } ret.Sort(); return(ret); }
/// <summary> /// 魚を削除する /// </summary> /// <param name="iRod">竿</param> /// <returns>True:成功</returns> public bool DeleteFish(string iRodName, string iFishName) { logger.Trace("RodName={0} FishName={1}", iRodName, iFishName); FishDBModel fishDB = getFishDB(iRodName); //xmlに存在すれば削除する for (int i = 0; i < fishDB.Fishes.Count; i++) { if (fishDB.Fishes[i].FishName == iFishName) { fishDB.Fishes.RemoveAt(i); break; } } //Rod.xmlへ出力する if (!putFishDB(iRodName, fishDB)) { return(false); } return(true); }
/// <summary> /// xmlに登録内容を書き出す /// </summary> /// <param name="iFishDB">RodDBModel</param> /// <returns>True:成功</returns> private bool putFishDB(string iRodName, FishDBModel iFishDB) { string xmlFilename = PATH_FISHDB + @"\" + iRodName + ".xml"; try { for (int i = 0; i < Constants.FILELOCK_RETRY_COUNT; i++) { try { using (FileStream fs = new FileStream(xmlFilename, FileMode.Create, FileAccess.Write, FileShare.None))//ファイルロック { StreamWriter sw = new StreamWriter(fs, new UTF8Encoding(false)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(String.Empty, String.Empty); XmlSerializer serializer = new XmlSerializer(typeof(FishDBModel)); serializer.Serialize(sw, iFishDB, ns); //書き込み sw.Flush(); sw = null; fs.Close(); } break; } catch (IOException) { Thread.Sleep(100); continue; } } return(true); } catch (Exception e) { logger.Fatal("{0}の登録中にエラーが発生しました。", xmlFilename); throw e; } }
/// <summary> /// 魚を取得する(ID,Zone) /// </summary> /// <param name="iRodName">竿名称</param> /// <param name="iID1">ID1</param> /// <param name="iID2">ID2</param> /// <param name="iID3">ID3</param> /// <param name="iID4">ID4</param> /// <param name="iWithUnknownFish">不明魚も返す場合Trueを指定</param> /// <returns></returns> public FishDBFishModel SelectFishFromIDZone(string iRodName, int iID1, int iID2, int iID3, int iID4, string iZoneName, bool iWithUnknownFish) { logger.Trace("RodName={0} ID1={1} ID2={2} ID3={3} ID4={4} ZoneName={5} WithUnknownFish={6}", iRodName, iID1, iID2, iID3, iID4, iZoneName, iWithUnknownFish); FishDBModel fishDB = getFishDB(iRodName); foreach (FishDBFishModel fish in fishDB.Fishes) { if (iWithUnknownFish == true || (iWithUnknownFish == false && fish.FishType != FishDBFishTypeKind.UnknownSmallFish && fish.FishType != FishDBFishTypeKind.UnknownLargeFish && fish.FishType != FishDBFishTypeKind.UnknownItem && fish.FishType != FishDBFishTypeKind.UnknownMonster && fish.FishType != FishDBFishTypeKind.Unknown)) { if (fish.IDs.Contains(new FishDBIdModel(iID1, iID2, iID3, iID4)) && fish.ZoneNames.Contains(iZoneName)) { return(fish); } } } return(new FishDBFishModel()); }
/// <summary> /// xmlファイルをコンバートする(1.0.0→1.0.5) /// </summary> private void convert1_0_0to1_0_5(string iXmlFileName, string iRodName) { FishDBModel1_0_0 fishdb1_0_0 = getFishDB1_0_0(iRodName); FishDBModel fishdb1_0_5 = new FishDBModel(); fishdb1_0_5.Version = "1.0.5"; fishdb1_0_5.RodName = fishdb1_0_0.RodName; foreach (FishDBFishModel1_0_0 fish1_0_0 in fishdb1_0_0.Fishes) { FishDBFishModel fish1_0_5 = new FishDBFishModel(); //FishDBFishTypeKind.Monster→FishDBFishTypeKind.UnknownMonster if (fish1_0_0.FishType == FishDBFishTypeKind.Monster) { fish1_0_0.FishType = FishDBFishTypeKind.UnknownMonster; } fish1_0_5.FishType = fish1_0_0.FishType; //FishName if (fish1_0_0.FishType == FishDBFishTypeKind.UnknownSmallFish || fish1_0_0.FishType == FishDBFishTypeKind.UnknownLargeFish || fish1_0_0.FishType == FishDBFishTypeKind.UnknownItem || fish1_0_0.FishType == FishDBFishTypeKind.UnknownMonster || fish1_0_0.FishType == FishDBFishTypeKind.Unknown) { if (fish1_0_0.IDs.Count > 0) { fish1_0_5.FishName = FishDB.GetTmpFishNameFromFishType(fish1_0_0.FishType, fish1_0_0.IDs[0].ID1, fish1_0_0.IDs[0].ID2, fish1_0_0.IDs[0].ID3, fish1_0_0.IDs[0].ID4); } else { fish1_0_5.FishName = fish1_0_0.FishName; } } else { fish1_0_5.FishName = fish1_0_0.FishName; } //ID foreach (FishDBIdModel1_0_0 id1_0_0 in fish1_0_0.IDs) { FishDBIdModel id1_0_5 = new FishDBIdModel(); id1_0_5.ID1 = id1_0_0.ID1; id1_0_5.ID2 = id1_0_0.ID2; id1_0_5.ID3 = id1_0_0.ID3; id1_0_5.ID4 = id1_0_0.ID4; id1_0_5.Count = id1_0_0.Count; id1_0_5.Critical = id1_0_0.Critical; id1_0_5.ItemType = FishDBItemTypeKind.Common; fish1_0_5.IDs.Add(id1_0_5); } //エリア 初期化する fish1_0_5.ZoneNames = new List <string>(); //エサ fish1_0_5.BaitNames = fish1_0_0.BaitNames; fishdb1_0_5.Fishes.Add(fish1_0_5); } //バックアップ string backupFileName = iXmlFileName + ".bak"; if (File.Exists(backupFileName)) { File.Delete(backupFileName); } File.Copy(iXmlFileName, backupFileName); //xml書き込み putFishDB(iRodName, fishdb1_0_5); }
public bool AddFish(string iRodName, string iFishName, FishDBFishTypeKind iFishType, FishDBIdModel iID, string iZoneName, string iBaitName) { logger.Trace("RodName={0} Fish={1} Type={2} ID={3} Zone={4} Bait={5}", iRodName, iFishName, iFishType, iID, iZoneName, iBaitName); FishDBModel fishDB = getFishDB(iRodName); fishDB.Version = VERSION; fishDB.RodName = iRodName; //不明魚として登録されている場合、削除する for (int fishIdx = 0; fishIdx < fishDB.Fishes.Count; fishIdx++) { if (fishDB.Fishes[fishIdx].IDs.Contains(iID) && fishDB.Fishes[fishIdx].ZoneNames.Contains(iZoneName) && (fishDB.Fishes[fishIdx].FishType == FishDBFishTypeKind.UnknownSmallFish || fishDB.Fishes[fishIdx].FishType == FishDBFishTypeKind.UnknownLargeFish || fishDB.Fishes[fishIdx].FishType == FishDBFishTypeKind.UnknownItem || fishDB.Fishes[fishIdx].FishType == FishDBFishTypeKind.UnknownMonster || fishDB.Fishes[fishIdx].FishType == FishDBFishTypeKind.Unknown)) { fishDB.Fishes[fishIdx].ZoneNames.Remove(iZoneName); //エリア情報が無くなっった場合、魚情報を削除する if (fishDB.Fishes[fishIdx].ZoneNames.Count == 0) { fishDB.Fishes.RemoveAt(fishIdx); } break; } } //更新処理 bool foundFlg = false; for (int fishIdx = 0; fishIdx < fishDB.Fishes.Count; fishIdx++) { if (fishDB.Fishes[fishIdx].FishName == iFishName) { foundFlg = true; fishDB.Fishes[fishIdx].FishName = iFishName; fishDB.Fishes[fishIdx].FishType = iFishType; if (!fishDB.Fishes[fishIdx].IDs.Contains(iID)) { logger.Info("IDの追加 竿={0} 魚={1} ID={2}", iRodName, iFishName, iID); fishDB.Fishes[fishIdx].IDs.Add(iID); } if (!fishDB.Fishes[fishIdx].ZoneNames.Contains(iZoneName)) { logger.Info("エリアの追加 竿={0} 魚={1} エリア={2}", iRodName, iFishName, iZoneName); fishDB.Fishes[fishIdx].ZoneNames.Add(iZoneName); } if (!fishDB.Fishes[fishIdx].BaitNames.Contains(iBaitName)) { logger.Info("エサの追加 竿={0} 魚={1} エサ={2}", iRodName, iFishName, iBaitName); fishDB.Fishes[fishIdx].BaitNames.Add(iBaitName); } } } //新規追加処理 if (!foundFlg) { logger.Info("魚の追加 竿={0} 魚={1} 魚タイプ={2} ID={3} エリア={4} エサ={5}", iRodName, iFishName, iFishType, iID, iZoneName, iBaitName); FishDBFishModel fish = new FishDBFishModel(); fish.FishName = iFishName; fish.FishType = iFishType; fish.IDs.Add(iID); fish.ZoneNames.Add(iZoneName); fish.BaitNames.Add(iBaitName); fishDB.Fishes.Add(fish); } //ソート fishDB.Fishes.Sort(FishDBFishModel.SortTypeName); for (int i = 0; i < fishDB.Fishes.Count; i++) { fishDB.Fishes[i].IDs.Sort(FishDBIdModel.SortCountCritical); } //Rod.xmlへ出力する if (!putFishDB(iRodName, fishDB)) { return(false); } return(true); }