public HfsPlusFileSystemImpl(Stream s) : base(new DiscFileSystemOptions()) { s.Position = 1024; byte[] headerBuf = Utilities.ReadFully(s, 512); VolumeHeader hdr = new VolumeHeader(); hdr.ReadFrom(headerBuf, 0); Context = new HfsPlus.Context(); Context.VolumeStream = s; Context.VolumeHeader = hdr; FileBuffer catalogBuffer = new FileBuffer(Context, hdr.CatalogFile, CatalogNodeId.CatalogFileId); Context.Catalog = new BTree <CatalogKey>(catalogBuffer); FileBuffer extentsBuffer = new FileBuffer(Context, hdr.ExtentsFile, CatalogNodeId.ExtentsFileId); Context.ExtentsOverflow = new BTree <ExtentKey>(extentsBuffer); // Establish Root directory byte[] rootThreadData = Context.Catalog.Find(new CatalogKey(CatalogNodeId.RootFolderId, string.Empty)); CatalogThread rootThread = new CatalogThread(); rootThread.ReadFrom(rootThreadData, 0); byte[] rootDirEntryData = Context.Catalog.Find(new CatalogKey(rootThread.ParentId, rootThread.Name)); DirEntry rootDirEntry = new DirEntry(rootThread.Name, rootDirEntryData); RootDirectory = (Directory)GetFile(rootDirEntry); }
/// <summary> /// Initializes a new instance of the <see cref="HfsPlusFileSystemImpl"/> class. /// </summary> /// <param name="stream">A stream containing the file system.</param> public HfsPlusFileSystemImpl(Stream stream) : base(new DiscFileSystemOptions()) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (stream.Length < 0x600) { throw new InvalidDataException("The stream does not represent a valid HFS+ file system"); } stream.Position = 1024; byte[] headerBuf = StreamUtilities.ReadExact(stream, 512); VolumeHeader hdr = new VolumeHeader(); hdr.ReadFrom(headerBuf, 0); if (!hdr.IsValid) { throw new InvalidDataException("The stream does not represent a valid HFS+ file system"); } this.Context = new Context(); this.Context.VolumeStream = stream; this.Context.VolumeHeader = hdr; FileBuffer catalogBuffer = new FileBuffer(this.Context, hdr.CatalogFile, CatalogNodeId.CatalogFileId); this.Context.Catalog = new BTree <CatalogKey>(catalogBuffer); FileBuffer extentsBuffer = new FileBuffer(this.Context, hdr.ExtentsFile, CatalogNodeId.ExtentsFileId); this.Context.ExtentsOverflow = new BTree <ExtentKey>(extentsBuffer); FileBuffer attributesBuffer = new FileBuffer(this.Context, hdr.AttributesFile, CatalogNodeId.AttributesFileId); this.Context.Attributes = new BTree <AttributeKey>(attributesBuffer); // Establish Root directory byte[] rootThreadData = this.Context.Catalog.Find(new CatalogKey(CatalogNodeId.RootFolderId, string.Empty)); CatalogThread rootThread = new CatalogThread(); rootThread.ReadFrom(rootThreadData, 0); byte[] rootDirEntryData = this.Context.Catalog.Find(new CatalogKey(rootThread.ParentId, rootThread.Name)); DirEntry rootDirEntry = new DirEntry(rootThread.Name, rootDirEntryData); this.RootDirectory = (HfsPlusDirectory)this.GetFile(rootDirEntry); }
internal static bool Detect(Stream stream) { if (stream.Length < 1536) { return false; } stream.Position = 1024; byte[] headerBuf = Utilities.ReadFully(stream, 512); VolumeHeader hdr = new VolumeHeader(); hdr.ReadFrom(headerBuf, 0); return hdr.IsValid; }
internal static bool Detect(Stream stream) { if (stream.Length < 1536) { return false; } stream.Position = 1024; byte[] headerBuf = Utilities.ReadFully(stream, 512); VolumeHeader hdr = new VolumeHeader(); hdr.ReadFrom(headerBuf, 0); return hdr.IsValid; }
/// <summary> /// Detects whether a <see cref="Stream"/> represents a HFS+ file system or not. /// </summary> /// <param name="stream"> /// The stream for which to detect whether it contains a HFS+ file system or not. /// </param> /// <returns> /// <see langword="true"/> if <paramref name="stream"/> contains a HFS+ file system; /// otherwise, <see langword="false"/>. /// </returns> internal static bool Detect(Stream stream) { if (stream == null || stream.Length < 1536) { return(false); } stream.Position = 1024; byte[] headerBuf = StreamUtilities.ReadExact(stream, 512); VolumeHeader hdr = new VolumeHeader(); hdr.ReadFrom(headerBuf, 0); return(hdr.IsValid); }