/// <summary> /// Function to enumerate the files and directories for a mount point. /// </summary> /// <param name="physicalMountPoint">Mount point being enumerated.</param> /// <param name="mountPoint">Directory to hold the sub directories and files.</param> /// <param name="physicalDirectories">A list of directories in the physical file system (formatted to the virtual file system).</param> /// <param name="physicalFiles">A list of files in the physical file system (formatted to the virtual file system).</param> protected override void Enumerate(string physicalMountPoint, GorgonFileSystemDirectory mountPoint, out string[] physicalDirectories, out PhysicalFileInfo[] physicalFiles) { using (var reader = new GorgonBinaryReader(File.Open(physicalMountPoint, FileMode.Open, FileAccess.Read, FileShare.Read), false)) { // Skip the header. reader.ReadString(); int indexLength = reader.ReadInt32(); byte[] indexData = Decompress(reader.ReadBytes(indexLength)); string xmlData = Encoding.UTF8.GetString(indexData); ParseIndexXML(physicalMountPoint, mountPoint, XDocument.Parse(xmlData, LoadOptions.None), reader.BaseStream.Position, out physicalDirectories, out physicalFiles); } }
/// <summary> /// Function to enumerate the files and directories from a physical location and map it to a virtual location. /// </summary> /// <param name="physicalLocation">The physical location containing files and directories to enumerate.</param> /// <param name="mountPoint">A <see cref="IGorgonVirtualDirectory"/> that the directories and files from the physical file system will be mounted into.</param> /// <returns>A <see cref="GorgonPhysicalFileSystemData"/> object containing information about the directories and files contained within the physical file system.</returns> /// <exception cref="ArgumentNullException">Thrown when the <paramref name="physicalLocation"/>, or the <paramref name="mountPoint"/> parameters are <b>null</b>.</exception> /// <exception cref="ArgumentEmptyException">Thrown when the <paramref name="physicalLocation"/> parameter is empty.</exception> /// <remarks> /// <para> /// This will return a <see cref="GorgonPhysicalFileSystemData"/> representing the paths to directories and <see cref="IGorgonPhysicalFileInfo"/> objects under the virtual file system. Each file /// system file and directory is mapped from its <paramref name="physicalLocation"/> on the physical file system to a <paramref name="mountPoint"/> on the virtual file system. For example, if the /// mount point is set to <c>/MyMount/</c>, and the physical location of a file is <c>c:\SourceFileSystem\MyDirectory\MyTextFile.txt</c>, then the returned value should be /// <c>/MyMount/MyDirectory/MyTextFile.txt</c>. /// </para> /// <para> /// Implementors of a <see cref="GorgonFileSystemProvider"/> plug in can override this method to read the list of files from another type of file system, like a Zip file. /// </para> /// <para> /// Implementors of a <see cref="GorgonFileSystemProvider"/> should override this method to read the list of directories and files from another type of file system, like a Zip file. /// The default functionality will only enumerate directories and files from the operating system file system. /// </para> /// </remarks> protected override GorgonPhysicalFileSystemData OnEnumerate(string physicalLocation, IGorgonVirtualDirectory mountPoint) { using (var reader = new GorgonBinaryReader(File.Open(physicalLocation, FileMode.Open, FileAccess.Read, FileShare.Read))) { // Skip the header. reader.ReadString(); int indexLength = reader.ReadInt32(); byte[] indexData = Decompress(reader.ReadBytes(indexLength)); string xmlData = Encoding.UTF8.GetString(indexData); var index = XDocument.Parse(xmlData, LoadOptions.None); return(new GorgonPhysicalFileSystemData(EnumerateDirectories(index, mountPoint), EnumerateFiles(index, reader.BaseStream.Position, physicalLocation, mountPoint))); } }