/// <summary> Instantiates a new DocumentCache. </summary> /// <param name="cachePath"> Specifies the path to use to store cached items. </param> public DocumentCache(string cachePath, int size) { // Prepare the folder _cachePath = cachePath; // Prepare the structures _identifiers = new IdentifierIndex(); _cRC32s = new Dictionary <string, uint>(size); _cache = new FixedSizeCache <string, string>(size); LockDirectory(); try { try { DateTime indexFileTime = DateTime.MinValue; // Init as invalid string indexFileName = Path.Combine(_cachePath, IndexFileName); string[] cacheFiles = Directory.GetFiles(_cachePath, "*" + CacheFileExtension); // Load the identifier index if (File.Exists(indexFileName)) { indexFileTime = File.GetLastWriteTimeUtc(indexFileName); using (Stream stream = new FileStream(indexFileName, FileMode.Open, FileAccess.Read)) { _identifiers.Load(stream); } // Initialize the CRC32s string cRC32TableFileName = Path.Combine(_cachePath, RC32FileName); if (File.Exists(cRC32TableFileName)) { if (File.GetLastWriteTimeUtc(cRC32TableFileName) == indexFileTime) { using (FileStream stream = new FileStream(cRC32TableFileName, FileMode.Open, FileAccess.Read)) { StreamUtility.LoadDictionary(stream, _cRC32s, typeof(String), typeof(UInt32)); } } else { indexFileTime = DateTime.MinValue; // CRC32 and Index file times doen't match. Invalid index. } } else { indexFileTime = DateTime.MinValue; // No CRC32 table. Invalid index. } // Verify that ther are no cache files newer than the index foreach (string fileName in cacheFiles) { if (File.GetLastWriteTimeUtc(fileName) > indexFileTime) { indexFileTime = DateTime.MinValue; break; } } } if (indexFileTime == DateTime.MinValue) // If cache invalid, delete the files and clear cache { // Delete any existing cache files in the cache directory and clear the Identifiers foreach (string fileName in Directory.GetFiles(_cachePath, "*." + CacheFileExtension)) { if (File.GetLastWriteTimeUtc(fileName) > indexFileTime) { File.Delete(fileName); } } _identifiers.Clear(); _cRC32s.Clear(); } // Don't bother initializing the fixed sized cache. We'll let it be populated as requests come in. As a result, if the cache size has been reduced, it // will not be effective until the new cache size limit has been reached. } catch { //Prevent future problems by clearing the directory EmptyCacheDirectory(); throw; } } catch { UnlockDirectory(false); throw; } }
/// <summary> Loads index entries from XML data contained within a stream. </summary> public void Load(Stream stream) { StreamUtility.LoadDictionary(stream, _table, typeof(String), typeof(String)); }