/// <summary> /// 指定した板のインデックスを作成し直す /// </summary> /// <param name="cache"></param> /// <param name="board"></param> public static void Indexing(Cache cache, BoardInfo board) { OfflineThreadListReader reader = new OfflineThreadListReader(cache); List <ThreadHeader> items = new List <ThreadHeader>(); if (reader.Open(board)) { // ローカルに存在するすべてのファイルを読み込む while (reader.Read(items) != 0) { ; } reader.Close(); // サーバー情報をすべて書き換える foreach (ThreadHeader h in items) { h.BoardInfo.Server = board.Server; ThreadIndexer.SaveServerInfo(cache, h); } // 読み込んだスレッド情報を元に既得インデックス一覧を作成 GotThreadListIndexer.Write(cache, board, items); } }
/// <summary> /// 指定したスレッドのログを削除 /// </summary> /// <param name="header"></param> public virtual bool Remove(ThreadHeader header) { if (header != null) { // 既得インデックス一覧から削除 GotThreadListIndexer.Remove(this, header); // 書き込み履歴インデックス一覧から削除 // WroteHistoryIndexer.Remove(this, new WroteThreadHeader(header)); // ログファイルを削除 string idx = GetIndexPath(header); string dat = GetDatPath(header); header.GotByteCount = 0; header.GotResCount = 0; header.NewResCount = 0; header.Position = 0; header.ETag = String.Empty; header.LastModified = new DateTime(0); try { File.Delete(idx); File.Delete(dat); } catch { } } return(false); }
// スレッド一覧のインデックスを保存。壊れていることがたまにあるので、再生成できるようにする private void SaveThreadListIndices() { try { GotThreadListIndexer.Write(Cache, headerInfo); } catch (XmlException ex) { if (ex.Message.IndexOf("ルート要素が見つかりません") >= 0) { DialogResult r = MessageBox.Show( headerInfo.BoardInfo.Name + "板のインデックスが壊れています。今すぐ再生成しますか?\r\n(やたら時間かかる場合があります)", "インデックスなんだよ〜", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (r == DialogResult.Yes) { try { ClientBase.Stopper.Reset(); ThreadIndexer.Indexing(Cache, headerInfo.BoardInfo); } finally { ClientBase.Stopper.Set(); } } } } }
/// <summary> /// 生きているスレとdat落ちしているスレを分離 /// </summary> /// <param name="oldBoard">ログが存在する板</param> /// <param name="newBoard">生きているスレの移転先</param> /// <param name="leaveItems">dat落ちしているスレが格納される</param> /// <param name="liveItems">生きているスレが格納される</param> private void Separate(BoardInfo oldBoard, BoardInfo newBoard, out List <ThreadHeader> leaveItems, out List <ThreadHeader> liveItems) { leaveItems = new List <ThreadHeader>(); liveItems = new List <ThreadHeader>(); if (cache.Exists(oldBoard)) { List <ThreadHeader> oldItems = GotThreadListIndexer.Read(cache, oldBoard); List <ThreadHeader> newItems = new List <ThreadHeader>(); ThreadListReader listReader = null; if (oldItems.Count > 0) { try { listReader = TypeCreator.CreateThreadListReader(newBoard.Bbs); listReader.Open(newBoard); while (listReader.Read(newItems) != 0) { ; } // 移転先のスレ一覧に存在するログのみ移転 (dat落ちしているスレは移転しない) foreach (ThreadHeader header in oldItems) { Predicate <ThreadHeader> p = new Predicate <ThreadHeader>(delegate(ThreadHeader h) { return(h.Key == header.Key); }); if (newItems.Exists(p)) { // 生きているスレの板情報を移転先板に書き換える if (ThreadIndexer.Read(cache, header) != null) { ThreadIndexer.Delete(cache, header); liveItems.Add(header); header.BoardInfo = newBoard; ThreadIndexer.Write(cache, header); } } else { leaveItems.Add(header); } } } finally { if (listReader != null) { listReader.Close(); } } } } }