Beispiel #1
0
        private void GenerateCacheIfNeed(string domain)
        {
            if (!hmacFuncCache.ContainsKey(domain))
            {
                var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(domain));
                Func <string, string> onHash = (string input) =>
                {
                    var rawBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(input));
                    return(Convert.ToBase64String(rawBytes).Replace("/", "_").Replace("+", "_").Replace("=", "_"));
                };
                hmacFuncCache[domain] = onHash;
            }

            if (!onMemoryHeadCountCache.ContainsKey(domain))
            {
                onMemoryHeadCountCache[domain] = new Dictionary <Char, int>();
            }

            if (onMemoryHeadCountCache[domain].Count == 0)
            {
                // オンメモリキャッシュが空なので、ファイルがあればそこから生成する。
                var folderPaths = filePersist.DirectoryNamesInDomain(domain);
                foreach (var folderPath in folderPaths)
                {
                    var initial   = folderPath[folderPath.Length - 1];
                    var fileCount = filePersist.FileNamesInDomain(folderPath).Length;
                    onMemoryHeadCountCache[domain][initial] = fileCount;
                }
                return;
            }
        }
Beispiel #2
0
        /*
         *  storePath以下に保存されているファイルに対して、expirationDayCount より長く使用されていないファイルを消す。
         *  並列数 parallelHandleFileCount で同時ファイルアクセス上限をセット可能。デフォルトは30
         */
        public IEnumerator ExecuteExpiration(string storePath, int expirationDayCount, int parallelHandleFileCount = 30)
        {
            // 特定のドメインに含まれるファイルたちに対して、最終readの日付がNより前のファイルを消す。
            Debug.Assert(0 < parallelHandleFileCount, "parallelHandleFileCount must be more than 0.");

            // domainがあっても一つもフォルダが無い場合、終了
            var targetDirectoryPaths = filePersist.DirectoryNamesInDomain(storePath);

            if (!targetDirectoryPaths.Any())
            {
                yield break;
            }

            // 対象の最終アクセス日付を確認し、N日以上経過しているものを削除する。

            var running = true;

            Action threadAct = () =>
            {
                var targetDirectoryPathList = targetDirectoryPaths.ToList();

rest:
                var takeCount = Mathf.Min(targetDirectoryPathList.Count, parallelHandleFileCount);

                var currentTargetDirPaths = targetDirectoryPathList.GetRange(0, takeCount);
                targetDirectoryPathList.RemoveRange(0, takeCount);

                foreach (var currentTargetDirPath in currentTargetDirPaths)
                {
                    var filePaths = Directory.GetFiles(currentTargetDirPath);
                    foreach (var filePath in filePaths)
                    {
                        // 最低0日からで、最後にreadした日からの経過日数を出す
                        // DaysはSecondsやMinutesと違って上限なしのday数(11111とか)を返してくるので、このまま使用する。TotalDaysを使うとdoubleになるため避けている。
                        var elapsedUnreadDayCount = (DateTime.UtcNow - File.GetLastAccessTimeUtc(filePath)).Days;
                        if (expirationDayCount < elapsedUnreadDayCount)
                        {
                            // 一つでも経過していたら、フォルダ自体を削除する
                            Directory.Delete(currentTargetDirPath, true);
                            break;
                        }
                    }
                }

                if (0 < targetDirectoryPathList.Count)
                {
                    Thread.Sleep(10);
                    goto rest;
                }

                running = false;
            };

            var thread = new Thread(new ThreadStart(threadAct));

            thread.Start();

            while (running)
            {
                yield return(null);
            }
        }