private static IFileWriter DefaultFileWriter([NotNull] IFileSettingPhysicalFile physicalFile, [CanBeNull] IProcessDisplay processDisplay) { IFileWriter writer = null; switch (physicalFile) { case ICsvFile csv when !csv.JsonFormat: writer = new CsvFileWriter(csv, processDisplay); break; case StructuredFile structuredFile: writer = new StructuredFileWriter(structuredFile, processDisplay); break; } if (writer == null) { throw new NotImplementedException($"Writer for {physicalFile} not found"); } writer.WriteFinished += (sender, args) => { physicalFile.ProcessTimeUtc = DateTime.UtcNow; if (physicalFile.SetLatestSourceTimeForWrite) { new FileSystemUtils.FileInfo(physicalFile.FullPath).LastWriteTimeUtc = physicalFile.LatestSourceTimeUtc; } }; return(writer); }
/// <summary> /// Saves the setting for a physical file /// </summary> /// <param name="fileSettingPhysicalFile">The file setting to serialize.</param> /// <param name="askOverwrite"> /// The function to decide if we want to overwrite, usually a user propmpt /// </param> public static void SaveSettingFile([NotNull] IFileSettingPhysicalFile fileSettingPhysicalFile, [NotNull] Func <bool> askOverwrite) { if (fileSettingPhysicalFile == null) { return; } var fileName = fileSettingPhysicalFile.FileName + CsvFile.cCsvSettingExtension; var saveSetting = fileSettingPhysicalFile.Clone() as CsvFile; // Remove possibly set but irrelevant properties for reading saveSetting.FileName = string.Empty; saveSetting.ID = string.Empty; saveSetting.Header = string.Empty; saveSetting.Footer = string.Empty; // remove not needed Columns so they do not play into comparison saveSetting.ColumnCollection.Clear(); foreach (var col in fileSettingPhysicalFile.ColumnCollection) { if (col.Ignore || col.DataType == DataType.String && col.Convert || col.DataType != DataType.String) { saveSetting.ColumnCollection.AddIfNew(col); } } Logger.Debug("Saving setting {path}", fileName); string contens = null; using (var stringWriter = new StringWriter(CultureInfo.InvariantCulture)) { m_SerializerCurrentCsvFile.Value.Serialize(stringWriter, saveSetting, EmptyXmlSerializerNamespaces.Value); contens = stringWriter.ToString(); } var delete = false; if (FileSystemUtils.FileExists(fileName)) { var fileContend = FileSystemUtils.ReadAllText(fileName); // Check if we have actual changes if (fileContend.Equals(contens, StringComparison.OrdinalIgnoreCase)) { // what we want to write and what is written does mach, exit here do not save return; } if (askOverwrite.Invoke()) { delete = true; } else { // Exit here no overwrite allowed return; } } if (delete) { FileSystemUtils.DeleteWithBackup(fileName, false); } File.WriteAllText(fileName, contens); }
/// <summary> /// Create a source access based on a setting, the setting might contain information for /// containers like Zip of PGP /// </summary> /// <param name="setting">The setting of type <see cref="IFileSettingPhysicalFile" /></param> /// <param name="isReading"><c>true</c> if used for reading</param> public SourceAccess([NotNull] IFileSettingPhysicalFile setting, bool isReading = true) : this(setting.FullPath, isReading, setting.ID, setting.Recipient, setting.KeepUnencrypted) { }
/// <summary> /// Initializes a new instance of the <see cref="BaseFileWriter" /> class. /// </summary> /// <param name="fileSetting">the file setting with the definition for the file</param> /// <param name="processDisplay">The process display.</param> /// <exception cref="ArgumentNullException">fileSetting</exception> /// <exception cref="ArgumentException">No SQL Reader set</exception> protected BaseFileWriter([NotNull] IFileSettingPhysicalFile fileSetting, [CanBeNull] IProcessDisplay processDisplay) : this(fileSetting.ID, fileSetting.FullPath, fileSetting.HasFieldHeader, fileSetting.FileFormat.ValueFormatMutable, fileSetting.FileFormat, fileSetting.Recipient, fileSetting.KeepUnencrypted, fileSetting.IdentifierInContainer, fileSetting.Footer, fileSetting.Header, fileSetting.ColumnCollection.ReadonlyCopy(), fileSetting.ToString(), processDisplay) { }
public JsonFileReader(IFileSettingPhysicalFile fileSetting, IProcessDisplay processDisplay) : this(fileSetting.FullPath, fileSetting.ColumnCollection, fileSetting.RecordLimit, fileSetting.TreatNBSPAsSpace) => SetProgressActions(processDisplay);