internal ClusterMap(ClusterRoles[] clusterToRole, object[] clusterToFileId, Dictionary<object, string[]> fileIdToPaths) { _clusterToRole = clusterToRole; _clusterToFileId = clusterToFileId; _fileIdToPaths = fileIdToPaths; }
public ClusterMap GetClusterMap() { int totalClusters = (int)Utilities.Ceil(_self.Context.BiosParameterBlock.TotalSectors64, _self.Context.BiosParameterBlock.SectorsPerCluster); ClusterRoles[] clusterToRole = new ClusterRoles[totalClusters]; object[] clusterToFile = new object[totalClusters]; Dictionary<object, string[]> fileToPaths = new Dictionary<object, string[]>(); for (int i = 0; i < totalClusters; ++i) { clusterToRole[i] = ClusterRoles.Free; } foreach (FileRecord fr in Records) { if (fr.BaseFile.Value != 0) { continue; } File f = new File(_self.Context, fr); foreach (var stream in f.AllStreams) { string fileId; if (stream.AttributeType == AttributeType.Data && !string.IsNullOrEmpty(stream.Name)) { fileId = f.IndexInMft.ToString(CultureInfo.InvariantCulture) + ":" + stream.Name; fileToPaths[fileId] = Utilities.Map(f.Names, n => n + ":" + stream.Name); } else { fileId = f.IndexInMft.ToString(CultureInfo.InvariantCulture); fileToPaths[fileId] = f.Names.ToArray(); } ClusterRoles roles = ClusterRoles.None; if (f.IndexInMft < MasterFileTable.FirstAvailableMftIndex) { roles |= ClusterRoles.SystemFile; if (f.IndexInMft == MasterFileTable.BootIndex) { roles |= ClusterRoles.BootArea; } } else { roles |= ClusterRoles.DataFile; } if (stream.AttributeType != AttributeType.Data) { roles |= ClusterRoles.Metadata; } foreach (var range in stream.GetClusters()) { for (long cluster = range.Offset; cluster < range.Offset + range.Count; ++cluster) { clusterToRole[cluster] = roles; clusterToFile[cluster] = fileId; } } } } return new ClusterMap(clusterToRole, clusterToFile, fileToPaths); }
public ClusterMap GetClusterMap() { int totalClusters = (int)Utilities.Ceil(_self.Context.BiosParameterBlock.TotalSectors64, _self.Context.BiosParameterBlock.SectorsPerCluster); ClusterRoles[] clusterToRole = new ClusterRoles[totalClusters]; object[] clusterToFile = new object[totalClusters]; Dictionary <object, string[]> fileToPaths = new Dictionary <object, string[]>(); for (int i = 0; i < totalClusters; ++i) { clusterToRole[i] = ClusterRoles.Free; } foreach (FileRecord fr in Records) { if (fr.BaseFile.Value != 0) { continue; } File f = new File(_self.Context, fr); foreach (var stream in f.AllStreams) { string fileId; if (stream.AttributeType == AttributeType.Data && !string.IsNullOrEmpty(stream.Name)) { fileId = f.IndexInMft.ToString(CultureInfo.InvariantCulture) + ":" + stream.Name; fileToPaths[fileId] = Utilities.Map(f.Names, n => n + ":" + stream.Name); } else { fileId = f.IndexInMft.ToString(CultureInfo.InvariantCulture); fileToPaths[fileId] = f.Names.ToArray(); } ClusterRoles roles = ClusterRoles.None; if (f.IndexInMft < MasterFileTable.FirstAvailableMftIndex) { roles |= ClusterRoles.SystemFile; if (f.IndexInMft == MasterFileTable.BootIndex) { roles |= ClusterRoles.BootArea; } } else { roles |= ClusterRoles.DataFile; } if (stream.AttributeType != AttributeType.Data) { roles |= ClusterRoles.Metadata; } foreach (var range in stream.GetClusters()) { for (long cluster = range.Offset; cluster < range.Offset + range.Count; ++cluster) { clusterToRole[cluster] = roles; clusterToFile[cluster] = fileId; } } } } return(new ClusterMap(clusterToRole, clusterToFile, fileToPaths)); }