internal BuildFileInfo(string name, BuildDirectoryInfo parent, Stream source) : base(IsoUtilities.NormalizeFileName(name), MakeShortFileName(name, parent)) { _parent = parent; _contentStream = source; _contentSize = _contentStream.Length; }
public DirectoryExtent(BuildDirectoryInfo dirInfo, Dictionary<BuildDirectoryMember, uint> locationTable, Encoding enc, long start) : base(start, dirInfo.GetDataSize(enc)) { _dirInfo = dirInfo; _locationTable = locationTable; _enc = enc; }
internal BuildFileInfo(string name, BuildDirectoryInfo parent, string content) : base(IsoUtilities.NormalizeFileName(name), MakeShortFileName(name, parent)) { _parent = parent; _contentPath = content; _contentSize = new FileInfo(_contentPath).Length; }
internal BuildFileInfo(string name, BuildDirectoryInfo parent, byte[] content) : base(IsoUtilities.NormalizeFileName(name), MakeShortFileName(name, parent)) { _parent = parent; _contentData = content; _contentSize = content.LongLength; }
/// <summary> /// Initializes a new instance of the CDBuilder class. /// </summary> public CDBuilder() { _files = new List<BuildFileInfo>(); _dirs = new List<BuildDirectoryInfo>(); _rootDirectory = new BuildDirectoryInfo("\0", null); _dirs.Add(_rootDirectory); _buildParams = new BuildParameters(); _buildParams.UseJoliet = true; }
private void PopulateFromFolder(CDBuilder builder, DirectoryInfo di, string basePath, string bootBin) { FileInfo bootBinFile = null; FileInfo[] folderFiles = di.GetFiles(); //Add directory first, so we can set the creation time correctly. string localDirPath = di.FullName.Substring(basePath.Length); if (localDirPath.Length > 1) { //Add directory first, so it has the correct creation time. BuildDirectoryInfo dir = builder.AddDirectory(localDirPath); dir.CreationTime = di.CreationTimeUtc; } foreach (FileInfo file in folderFiles) { string filePath = file.FullName.Substring(basePath.Length); if (bootBin != null && file.Name.Equals(bootBin, StringComparison.OrdinalIgnoreCase)) { bootBinFile = file; //Ignore this for now, we want it last } else { builder.AddFile(filePath, file.FullName); } } foreach (DirectoryInfo dir in di.GetDirectories()) { PopulateFromFolder(builder, dir, basePath, null); } if (bootBinFile != null && bootBin != null) { builder.AddFile(bootBin, bootBinFile.FullName); long sectorSize = RoundUp(bootBinFile.Length, DATA_SECTOR_SIZE); builder.LastFileStartSector = (uint)(GD_END_LBA - 150 - (sectorSize / DATA_SECTOR_SIZE)); } else if (bootBin != null) { //User doesn't know what they're doing and gave us bad data. throw new FileNotFoundException("IP.BIN requires the boot file " + bootBin + " which was not found in the data directory."); } }
private static string GetPath(BuildDirectoryInfo bdi, bool stripSlash = true) { string path = string.Empty; do { path = (bdi.Name != "\0" ? bdi.Name : string.Empty) + "/" + path; bdi = bdi.Parent; } while (bdi != bdi.Parent); // Stip trailing slash if (stripSlash && path != "/") { path = path.Substring(0, path.Length - 1); } if (path[0] != '/') { path = "/" + path; } return(path); }
private BuildDirectoryInfo TryGetDirectory(string[] path, int pathLength, bool createMissing) { BuildDirectoryInfo focus = _rootDirectory; for (int i = 0; i < pathLength; ++i) { BuildDirectoryMember next; if (!focus.TryGetMember(path[i], out next)) { if (createMissing) { // This directory doesn't exist, create it... BuildDirectoryInfo di = new BuildDirectoryInfo(path[i], focus); focus.Add(di); _dirs.Add(di); focus = di; } else { return null; } } else { BuildDirectoryInfo nextAsBuildDirectoryInfo = next as BuildDirectoryInfo; if (nextAsBuildDirectoryInfo == null) { throw new IOException("File with conflicting name exists"); } else { focus = nextAsBuildDirectoryInfo; } } } return focus; }
private static string MakeShortFileName(string longName, BuildDirectoryInfo dir) { if (IsoUtilities.isValidFileName(longName)) { return longName; } char[] shortNameChars = longName.ToUpper(CultureInfo.InvariantCulture).ToCharArray(); for (int i = 0; i < shortNameChars.Length; ++i) { if (!IsoUtilities.isValidDChar(shortNameChars[i]) && shortNameChars[i] != '.' && shortNameChars[i] != ';') { shortNameChars[i] = '_'; } } string[] parts = IsoUtilities.SplitFileName(new string(shortNameChars)); if (parts[0].Length + parts[1].Length > 30) { parts[1] = parts[1].Substring(0, Math.Min(parts[1].Length, 3)); } if (parts[0].Length + parts[1].Length > 30) { parts[0] = parts[0].Substring(0, 30 - parts[1].Length); } string candidate = parts[0] + '.' + parts[1] + ';' + parts[2]; // TODO: Make unique return candidate; }