using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace RomCheater.Serialization { public interface ISerializationResultCount { int ResultCount { get; } } public abstract class SerializationWriter : ISerializationResultCount, IDisposable { private static string CreateFilename(Guid guid) { if (guid == Guid.Empty) { return DEFAULT_PATH; } else { return string.Format(@"{0}\{1}", DEFAULT_FOLDER, string.Format("{0}.tmp", guid.ToString())); } } private const string DEFAULT_FOLDER = "tmp"; private const string DEFAULT_FILENAME = "SerializedMemoryResults.tmp"; private static string DEFAULT_PATH = string.Format(@"{0}\{1}", DEFAULT_FOLDER,DEFAULT_FILENAME); //public SerializationWriter() : this(CreateFilename(Guid.Empty)) { } public SerializationWriter(int resultCount, Guid guid) : this(resultCount,guid, true) { } public SerializationWriter(int resultCount, Guid guid, bool delete) : this(CreateFilename(guid)) { ResultCount = resultCount; CreateFile(delete); } protected SerializationWriter(Guid guid) : this(0, guid, true) { } protected SerializationWriter(string filename) { FileName = filename; } #region ISerializationResultCount members public int ResultCount { get; protected set; } #endregion private FileStream fileStream; protected BinaryWriter binWriter; protected string FileName { get; private set; } private bool DeleteResultFile() { try { FileInfo fi = new FileInfo(FileName); if (fi.Exists) { fi.Delete(); return true; } return true; } catch { return false; } } private void CreateFile(bool delete) { if (delete) DeleteResultFile(); FileInfo fi = new FileInfo(FileName); if (!fi.Exists) { if (!fi.Directory.Exists) fi.Directory.Create(); FileStream t = fi.Create(); t.Close(); } fi = null; fileStream = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.Read); binWriter = new BinaryWriter(fileStream); } //protected void Write(byte[] data) //{ // binWriter.Write(data); //} #region IDisposable Support // Track whether Dispose has been called. private bool disposed = false; // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. //component.Dispose(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. // clean up any resources binWriter.Flush(); binWriter.Close(); binWriter = null; fileStream = null; // Note disposing has been done. disposed = true; } } // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~SerializationWriter() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } #endregion } }