/// <summary> /// Detect header skipper compliance and create an output file /// </summary> /// <param name="file">Name of the file to be parsed</param> /// <param name="outDir">Output directory to write the file to, empty means the same directory as the input file</param> /// <param name="nostore">True if headers should not be stored in the database, false otherwise</param> /// <returns>True if the output file was created, false otherwise</returns> public static bool DetectTransformStore(string file, string outDir, bool nostore) { // Create the output directory if it doesn't exist DirectoryExtensions.Ensure(outDir, create: true); logger.User($"\nGetting skipper information for '{file}'"); // Get the skipper rule that matches the file, if any SkipperRule rule = GetMatchingRule(file, string.Empty); // If we have an empty rule, return false if (rule.Tests == null || rule.Tests.Count == 0 || rule.Operation != HeaderSkipOperation.None) return false; logger.User("File has a valid copier header"); // Get the header bytes from the file first string hstr; try { // Extract the header as a string for the database #if NET_FRAMEWORK using (var fs = FileExtensions.TryOpenRead(file)) { #else using var fs = FileExtensions.TryOpenRead(file); #endif byte[] hbin = new byte[(int)rule.StartOffset]; fs.Read(hbin, 0, (int)rule.StartOffset); hstr = Utilities.ByteArrayToString(hbin); #if NET_FRAMEWORK } #endif } catch { return false; } // Apply the rule to the file string newfile = (string.IsNullOrWhiteSpace(outDir) ? Path.GetFullPath(file) + ".new" : Path.Combine(outDir, Path.GetFileName(file))); rule.TransformFile(file, newfile); // If the output file doesn't exist, return false if (!File.Exists(newfile)) return false; // Now add the information to the database if it's not already there if (!nostore) { BaseFile baseFile = FileExtensions.GetInfo(newfile, hashes: Hash.SHA1, asFiles: TreatAsFile.NonArchive); DatabaseTools.AddHeaderToDatabase(hstr, Utilities.ByteArrayToString(baseFile.SHA1), rule.SourceFile); } return true; }