// -------------------------------------------------------------------- // キャッシュ DB からディスク DB へコピー // -------------------------------------------------------------------- private static void CacheToDiskCore(TargetFolderInfo targetFolderInfo) { try { using CacheContext cacheContext = new(YlCommon.DriveLetter(targetFolderInfo.TargetPath)); cacheContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; // QueryTrackingBehavior.NoTracking(または AsNoTracking())時、結果の内容を変更して使いたい時は IQueryable<T> で受けてはならない(インスタンスの内容が変更できない) // List<T> 等に変換すれば結果のインスタンス内容を変更できる(変更しても SaveChanges() の対象にはならないと思う) List <TFound> cacheRecords = cacheContext.Founds.Where(x => x.ParentFolder == targetFolderInfo.TargetPath).ToList(); if (!cacheRecords.Any()) { // キャッシュが見つからない場合、ドライブレター以外の部分で合致するか再度検索 // 誤検知しないようコロンも含めて検索するので、YlCommon.WithoutDriveLetter() は使用しない String withoutDriveLetterOne = targetFolderInfo.TargetPath[1..];
// -------------------------------------------------------------------- // キャッシュ更新(追加) // records の ParentFolder はすべて同じ前提 // -------------------------------------------------------------------- public void UpdateCache(List <TFound> records) { String parentFolder = records.First().ParentFolder; // 追加しようとしているキャッシュと同じ親フォルダーの旧キャッシュ削除 IQueryable <TFound> removes = Founds.Where(x => x.ParentFolder == parentFolder); Founds.RemoveRange(removes); // 追加しようとしているキャッシュとドライブレターが異なるキャッシュ削除 removes = Founds.Where(x => !x.ParentFolder.Contains(YlCommon.DriveLetter(parentFolder))); Founds.RemoveRange(removes); SaveChanges(); // 新キャッシュ追加 foreach (TFound record in records) { // Uid を初期化して自動的に Uid を振ってもらうようにする record.Uid = 0; } Founds.AddRange(records); // キャッシュ管理テーブル更新 TCacheHeader?cacheHeader = CacheHeaders.FirstOrDefault(x => x.ParentFolder == parentFolder); Boolean needAdd = false; if (cacheHeader == null) { cacheHeader = new() { ParentFolder = parentFolder, }; needAdd = true; } cacheHeader.UpdateTime = YlCommon.UtcNowMjd(); if (needAdd) { CacheHeaders.Add(cacheHeader); } SaveChanges(); }
// ==================================================================== // public 関数 // ==================================================================== // -------------------------------------------------------------------- // ゆかり検索対象フォルダー追加 // 指定された親フォルダーのみを追加し、サブフォルダーは追加しない // <例外> Exception // -------------------------------------------------------------------- public async Task AddTargetFolderAsync(String parentFolder) { await Task.Run(() => { #if DEBUGz Thread.Sleep(2000); #endif // フォルダーチェック if (String.IsNullOrEmpty(parentFolder)) { throw new Exception("追加するフォルダーの名前が空です。"); } if (!Directory.Exists(parentFolder)) { throw new Exception("指定されたフォルダーが存在しません:" + parentFolder); } // 親の重複チェック Boolean parentAdded = IndexOfTargetFolderInfoWithLock(parentFolder) >= 0; if (parentAdded) { throw new Exception(parentFolder + " は既に追加されています。"); } // 親の追加 TargetFolderInfo targetFolderInfo = new(parentFolder); lock (_targetFolderInfos) { _targetFolderInfos.Add(targetFolderInfo); } // 通知 YlModel.Instance.EnvModel.IsMainWindowDataGridCountChanged = true; YlModel.Instance.EnvModel.Sifolin.MainEvent.Set(); SetLomolinTargetDrives(); // スリープ状態のデバイスだとここで時間がかかる AdjustAutoTargetInfoIfNeeded(YlCommon.DriveLetter(parentFolder)); }); }
// -------------------------------------------------------------------- // サブフォルダーも含めて FolderTaskDetail を Remove にする // parentFolder は IsParent である必要がある // -------------------------------------------------------------------- public Boolean SetFolderTaskDetailOfFolderToRemove(String parentFolder) { lock (_targetFolderInfos) { Int32 parentIndex = IndexOfTargetFolderInfoWithoutLock(parentFolder); if (parentIndex < 0) { return(false); } Debug.Assert(_targetFolderInfos[parentIndex].IsParent, "SetFolderTaskDetailToRemove() not parent"); for (Int32 i = parentIndex; i < parentIndex + _targetFolderInfos[parentIndex].NumTotalFolders; i++) { _targetFolderInfos[i].SetFolderTaskKind(FolderTaskKind.Remove); _targetFolderInfos[i].SetFolderTaskDetail(FolderTaskDetail.Remove); _targetFolderInfos[i].FolderTaskStatus = FolderTaskStatus.Queued; } } // 通知 YlModel.Instance.EnvModel.IsMainWindowDataGridItemUpdated = true; YlModel.Instance.EnvModel.Sifolin.MainEvent.Set(); AdjustAutoTargetInfoIfNeeded(YlCommon.DriveLetter(parentFolder)); return(true); }