public void Build(string strParentDir, CompressArgs objArgs) { string[] files = System.IO.Directory.GetFiles(strParentDir); foreach (string file in files) { if (ExtMatch(file, objArgs.Extensions)) { FileEntry fe = new FileEntry(); fe.strFullPath = file; fe.strTableRelativePath = fe.strFullPath; //TODO: fix this ** make it relative to tabe. fe.iFileSize = (Int32) new System.IO.FileInfo(file).Length; fe.iFileOffset = Files.Count > 0 ? Files[Files.Count - 1].iFileOffset + Files[Files.Count - 1].iFileSize : 0; Files.Add(fe); } } string[] dirs = System.IO.Directory.GetDirectories(strParentDir); foreach (string dir in dirs) { if (!IsExcludeDir(dir, objArgs)) { Build(dir, objArgs); } } }
private bool IsExcludeDir(string dir, CompressArgs objArgs) { string full = System.IO.Path.GetFullPath(dir); foreach (string path in objArgs.ExcludeDirs) { string full2 = System.IO.Path.GetFullPath(path); if (full.Equals(full2)) { return(true); } } return(false); }
static void Main(string[] args) { CompressArgs objArgs = new CompressArgs(); objArgs.Parse(args); Console.WriteLine("**************************************************"); Console.WriteLine("* Compressor v" + strVersion); Console.WriteLine("* Usage: compressor.exe -p [exe path] -o [output dir] -r [root dir] -e [csv of file exts'] -x [dir to exclude]"); Console.WriteLine("* Derek page 1/6/18"); Console.WriteLine("**************************************************"); if (!System.IO.Directory.Exists(objArgs.RootDir)) { Utils.PrintAndExit("Directory '" + objArgs.RootDir + "' does not exist.", true); } else if (!System.IO.File.Exists(objArgs.ExeName)) { Utils.PrintAndExit("Executable file '" + objArgs.ExeName + "' does not exist.", true); } else { try { Console.WriteLine("Building.."); //build file table. FileTable ft = new FileTable(); ft.Build(objArgs.RootDir, objArgs); Console.WriteLine("Located " + ft.Files.Count + " files, " + (float)ft.GetTotalFileLengthBytes() / (float)(1000 * 1000) + " Mbytes."); byte[] exeBytes = System.IO.File.ReadAllBytes(objArgs.ExeName); byte[] _final = Utils.Combine(exeBytes, ft.Serialize()); //Pack on 4 bytes at the end of the EXE size so we can find the table. _final = Utils.Combine(_final, (Int32)exeBytes.Length); //Pack an additional signature _final = Utils.Combine(_final, ASCIIEncoding.ASCII.GetBytes("asdf")); //Backup? Maybe. //System.IO.File.Move(strExe, strExe + "-" + DateTime.Now.ToString("YYYYMMDDHHMMSS")); string strOutfull = System.IO.Path.GetFullPath(objArgs.OutputDir); Console.WriteLine("Saving to '" + strOutfull + "'.."); if (!System.IO.Directory.Exists(strOutfull)) { Console.WriteLine("Creating directory '" + strOutfull + "'"); System.IO.Directory.CreateDirectory(strOutfull); } string strOutFile = System.IO.Path.Combine(strOutfull, objArgs.ExeName); Console.WriteLine("Writing '" + strOutFile + "'"); System.IO.File.WriteAllBytes(strOutFile, _final); ft.Print(); Console.WriteLine("Packed " + exeBytes.Length + " bytes to " + _final.Length + " bytes."); Console.WriteLine("Added " + (_final.Length - exeBytes.Length) + " bytes."); // Utils.PrintAndExit("Press any key to exit", false); } catch (Exception ex) { Utils.PrintAndExit("There was an error while building the file table:\r\n" + ex.ToString(), true); } } }