Ejemplo n.º 1
0
        // --------------------------------------------------------------------
        // 指定フォルダ内のファイルを検索してゆかり用データベースに追加
        // ユニーク ID、フルパス、フォルダーのみ記入する
        // ファイルは再帰検索しない
        // --------------------------------------------------------------------
        private void AddFileNamesCore(TargetFolderInfo targetFolderInfo)
        {
            // フォルダー除外設定を読み込む
            if (YlCommon.DetectFolderExcludeSettingsStatus(targetFolderInfo.TargetPath) == FolderExcludeSettingsStatus.True)
            {
                return;
            }

            // Uid
            using ListContextInMemory listContextInMemory = new();
            Int64 uid = listContextInMemory.Founds.Any() ? listContextInMemory.Founds.Max(x => x.Uid) + 1 : 1;

            // キャッシュが使われていない場合はディスク DB の Uid とも重複しないようにする(全体の動作状況がエラーではない場合のみ)
            if (YlModel.Instance.EnvModel.YukaListerWholeStatus != YukaListerStatus.Error && !targetFolderInfo.IsCacheUsed)
            {
                using ListContextInDisk listContextInDisk = new();
                if (listContextInDisk.Founds.Any())
                {
                    uid = Math.Max(uid, listContextInDisk.Founds.Max(x => x.Uid) + 1);
                }
            }

            // 検索
            String[] allPathes;
            try
            {
                allPathes = Directory.GetFiles(targetFolderInfo.TargetPath);
            }
            catch (Exception)
            {
                return;
            }

            // 追加準備
            List <TFound> addRecords = new();

            addRecords.Capacity = allPathes.Length;
            foreach (String path in allPathes)
            {
                if (!YlModel.Instance.EnvModel.YlSettings.TargetExts.Contains(Path.GetExtension(path).ToLower()))
                {
                    continue;
                }

                TFound record = new();
                record.Uid          = uid;
                record.Path         = path;
                record.Folder       = Path.GetDirectoryName(path) ?? String.Empty;
                record.ParentFolder = targetFolderInfo.ParentPath;

                // 楽曲名とファイルサイズが両方とも初期値だと、ゆかりが検索結果をまとめてしまうため、ダミーのファイルサイズを入れる
                // (文字列である楽曲名を入れると処理が遅くなるので処理が遅くなりにくい数字のファイルサイズをユニークにする)
                record.FileSize = -uid;

                addRecords.Add(record);
                uid++;
            }

            // メモリー DB に追加
            listContextInMemory.Founds.AddRange(addRecords);
            listContextInMemory.SaveChanges();
            _needsMemoryDbToDiskDb  = true;
            _needsMemoryDbToCacheDb = true;

            // キャッシュが使われていない場合はディスク DB にも追加(全体の動作状況がエラーではない場合のみ)
            if (YlModel.Instance.EnvModel.YukaListerWholeStatus != YukaListerStatus.Error && !targetFolderInfo.IsCacheUsed)
            {
                using ListContextInDisk listContextInDisk = new();
                listContextInDisk.Founds.AddRange(addRecords);
                listContextInDisk.SaveChanges();
                YlModel.Instance.EnvModel.LogWriter.LogMessage(Common.TRACE_EVENT_TYPE_STATUS, "ゆかり用リストデータベースにファイル名を追加しました。" + targetFolderInfo.TargetPath);
            }
        }