#region --------------- Copyright Dresser Wayne Pignone ------------- /* * $Log: /Wrk/WayneLibraries/Wrk/Log/EventLogStorage/FileSystemStorage.cs $ * * 3 08-03-19 9:05 roger.månsson * Exchange illegal file name characters with '_' in event file name, and * also exchange '\' characters with '_'. * * 2 08-02-13 9:24 Mattias.larsson * FxCop fixes. */ #endregion using System.Collections.Generic; using System.Text; using System.Xml; using System.IO; using Wayne.Lib.IO; namespace Wayne.Lib.Log { /// /// The FileSystemStorage event storage class stores the events in the file system which /// enables them to survive a system restart. /// internal class FileSystemStorage : ISubscriptionStorage { #region Fields private object dbLock = new object(); private string basePath; #endregion #region Construction public FileSystemStorage() { basePath = Paths.Combine("EventStorage", System.AppDomain.CurrentDomain.FriendlyName); FileSupport.EnsureDirectoryExists(basePath); } #endregion #region Methods public void Remove(string eventSubscriberId, EventLogEntry eventLogEntry) { GetAndCreateSubscriberDir(eventSubscriberId); lock (dbLock) { string fileName = Path.Combine(basePath, Path.Combine(eventSubscriberId, CreateFileName(eventLogEntry))); if (File.Exists(fileName)) File.Delete(fileName); } } public EventLogEntry[] GetStoredEvents(string eventSubscriberId) { GetAndCreateSubscriberDir(eventSubscriberId); lock (dbLock) { List eventLogEntryList = new List(); string[] filePaths = Directory.GetFiles(Path.Combine(basePath, eventSubscriberId)); XmlDocument xmlDoc = new XmlDocument(); foreach (string filePath in filePaths) { FileSupport.LoadXml(xmlDoc, filePath); EventLogEntry entry = EventLogEntry.Deserialize(xmlDoc["LogEntry", EventLogXml.Ns]); if (entry != null) eventLogEntryList.Add(entry); } return eventLogEntryList.ToArray(); } } public void Add(string eventSubscriberId, EventLogEntry eventLogEntry) { GetAndCreateSubscriberDir(eventSubscriberId); lock (dbLock) { string subscriberPath = GetAndCreateSubscriberDir(eventSubscriberId); string eventFileName = CreateFileName(eventLogEntry); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; settings.Indent = true; settings.NewLineHandling = NewLineHandling.Entitize; using (XmlWriter xmlWriter = XmlWriter.Create(Path.Combine(subscriberPath, eventFileName), settings)) { eventLogEntry.WriteXml(xmlWriter, ""); } } } private string GetAndCreateSubscriberDir(string eventSubscriberId) { string subscriberPath = Path.Combine(basePath, eventSubscriberId); FileSupport.EnsureDirectoryExists(subscriberPath); return subscriberPath; } private static string CreateFileName(EventLogEntry eventLogEntry) { string eventFileName = eventLogEntry.EntityCategory.GetName(EntityLogKind.Entity, false) + eventLogEntry.GetDateTimeString("yyyyMMddHHmmss") + ".xml"; foreach (char invalidChar in Path.GetInvalidPathChars()) { eventFileName = eventFileName.Replace(invalidChar, '_'); } eventFileName = eventFileName.Replace('\\', '_'); return eventFileName; } #endregion } }