/// <summary> /// Reads the header information from an sidecar file /// and reconstructs a header object. /// </summary> /// <param name="reader">A binary reader to the sidecar file.</param> /// <returns>The reconstructed header object.</returns> private static SidecarFileHeader ReadHeader(BinaryReader reader) { SidecarFileHeader header = new SidecarFileHeader { SourceFileLastWriteTime = DateTime.FromBinary(reader.ReadInt64()), SequenceCount = reader.ReadInt32(), FileVersion = reader.ReadInt32() }; return(header); }
/// <summary> /// Writes the header to the sidecar file, and also writes information /// about the sidecar file itself. /// </summary> /// <param name="sequenceCount">The number of sequences in the source file.</param> /// <returns>true if the header was successfully created; otherwise, false</returns> private void WriteHeaderData(int sequenceCount) { _header = new SidecarFileHeader(_sourceFileName, sequenceCount); _streamWriter.Seek(0, SeekOrigin.Begin); // Write sidecar file size and last written date to the space left at top _offsetWriter.Write(_streamWriter.Length); _offsetWriter.Write(DateTime.Now.Date.ToFileTime()); _offsetWriter.Write(_header.SourceFileLastWriteTime.ToBinary()); _offsetWriter.Write(_header.SequenceCount); _offsetWriter.Write(_header.FileVersion); }
/// <summary> /// Opens an existing sidecar file and checks its validity. /// </summary> /// <param name="sidecarFileName">The path to the sidecar file.</param> private void OpenSidecar(string sidecarFileName) { // reset flag before proceeding if (IsSidecarValid) { IsSidecarValid = false; } try { _streamReader = new FileStream(sidecarFileName, FileMode.Open, FileAccess.Read); _offsetReader = new BinaryReader(_streamReader); _sidecarLength = _offsetReader.ReadInt64(); _sidecarLastWriteTime = _offsetReader.ReadInt64(); FileInfo sidecarFileInfo = new FileInfo(sidecarFileName); // validate the sidecar file properties if ((_sidecarLastWriteTime == sidecarFileInfo.LastWriteTime.Date.ToFileTime()) && (_sidecarLength == sidecarFileInfo.Length)) { _header = ReadHeader(_offsetReader); // validate the source file properties if (_header.FileVersion == FileVersion && _header.SourceFileLastWriteTime == new FileInfo(_sourceFileName).LastWriteTime) { IsSidecarValid = true; // sequence indexes start just after header _contentsOffset = _streamReader.Position; } else { CloseInputStream(); } } else // close streams if sidecar is invalid { CloseInputStream(); } } catch (Exception) { CloseInputStream(); } }