private async Task loadRegisterFromDiskAsync() { _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:Loading cache register: {0}", CacheRegister); if (!Directory.Exists(CachePath)) { _trace.TraceEvent(TraceEventType.Warning, 0, "EveLibFileCache:Cache directory not found: {0}", CachePath); return; } if (!File.Exists(CacheRegister)) { _trace.TraceEvent(TraceEventType.Warning, 0, "EveLibFileCache:Cache register not found: {0}", CacheRegister); return; } try { // read all lines string[] data = await AsyncFileUtilities.ReadAllLinesAsync(CacheRegister).ConfigureAwait(false); foreach (string entry in data) { string[] split = entry.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); DateTime cacheValidUntil = DateTime.Parse(split[1], CultureInfo.InvariantCulture); string fileName = split[0]; // if cache is still valid we register it if (cacheValidUntil > DateTime.UtcNow) { _register[fileName] = cacheValidUntil; } else { // if cache is out of date we delete the data if (File.Exists(CachePath + Config.Separator + fileName)) { File.Delete(CachePath + Config.Separator + fileName); } } } // delete all files that aren't listed in the register file IEnumerable <string> files = Directory.EnumerateFiles(CachePath); foreach ( string file in files.Where( file => !_register.ContainsKey(file.Replace(CachePath + Config.Separator, "")) && !file.Equals(CacheRegister))) { File.Delete(file); } _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheRegisterLoaded"); } catch (Exception) { _trace.TraceEvent(TraceEventType.Error, 0, "EveLibFileCache:Could not load cache register"); } }
private async Task writeRegisterToDiskAsync() { _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:Writing cache register to disk"); var lockTask = await _registerLock.WriterLockAsync(); try { await AsyncFileUtilities.WriteAllLinesAsync(CacheRegister, _register.Select(x => x.Key + "," + x.Value.ToString(CultureInfo.InvariantCulture))) .ConfigureAwait(false); } finally { lockTask.Dispose(); } }
/// <summary> /// Loads data from cache /// </summary> /// <param name="uri">The uri to load cache for</param> /// <returns>The cached data</returns> public async Task <string> LoadAsync(Uri uri) { _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache.LoadAsync:Start"); await initAsync().ConfigureAwait(false); string data = null; _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheRegisterLookupUri: {0}", uri); string hash = getHash(uri); _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheRegisterLookupHash: {0}", hash); DateTime cacheExpirationTime; bool found = _register.TryGetValue(hash, out cacheExpirationTime); _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheRegisterHit: {0}", found); if (found) { bool validCache = DateTime.UtcNow < cacheExpirationTime; _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheIsValid: {0} ({1})", validCache, cacheExpirationTime); if (validCache) { string filePath = CachePath + Config.Separator + hash; bool fileExist = File.Exists(filePath); _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:CacheDataFound: {0}", fileExist); if (File.Exists(filePath)) { try { data = await AsyncFileUtilities.ReadAllTextAsync(CachePath + Config.Separator + getHash(uri)) .ConfigureAwait(false); _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:Data successfully loaded from cache: {0}", filePath); } catch (Exception) { _trace.TraceEvent(TraceEventType.Error, 0, "EveLibFileCache:Cache data could not be loaded: {0}", filePath); } } } } _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache.LoadAsync:Complete"); return(data); }
private Task writeCacheDataToDiskAsync(Uri uri, string data) { _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:Writing cache data to disk: {0}", uri); return(AsyncFileUtilities.WriteAllTextAsync(Path.Combine(CachePath, getHash(uri)), data)); }
private Task writeRegisterToDiskAsync() { _trace.TraceEvent(TraceEventType.Verbose, 0, "EveLibFileCache:Writing cache register to disk"); return(AsyncFileUtilities.WriteAllLinesAsync(CacheRegister, _register.Select(x => x.Key + "," + x.Value.ToString(CultureInfo.InvariantCulture)))); }