예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 /// <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)
 {
 }
예제 #4
0
 /// <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)
 {
 }
예제 #5
0
 public JsonFileReader(IFileSettingPhysicalFile fileSetting,
                       IProcessDisplay processDisplay)
     : this(fileSetting.FullPath,
            fileSetting.ColumnCollection, fileSetting.RecordLimit,
            fileSetting.TreatNBSPAsSpace) => SetProgressActions(processDisplay);