public int Replace(IEnumerable <ReplaceDef> files, SearchType searchType, string searchPattern, string replacePattern, GrepSearchOption searchOptions, int codePage) { string tempFolder = Utils.GetTempFolder(); if (files == null || !files.Any() || !Directory.Exists(tempFolder)) { return(0); } GrepEngineBase.ResetGuidxCache(); replacePattern = Utils.ReplaceSpecialCharacters(replacePattern); int processedFiles = 0; Utils.CancelSearch = false; string tempFileName = null; try { foreach (var item in files) { ProcessedFile(this, new ProgressStatus(true, processedFiles, processedFiles, null, item.OrginalFile)); // the value in the files dictionary is the temp file name assigned by // the caller for any possible Undo operation tempFileName = Path.Combine(tempFolder, item.BackupName); IGrepEngine engine = GrepEngineFactory.GetReplaceEngine(item.OrginalFile, SearchParams, FileFilter); try { processedFiles++; // Copy file Utils.CopyFile(item.OrginalFile, tempFileName, true); Utils.DeleteFile(item.OrginalFile); Encoding encoding = Encoding.Default; if (codePage > -1) { encoding = Encoding.GetEncoding(codePage); } else if (!Utils.IsBinary(tempFileName)) { encoding = Utils.GetFileEncoding(tempFileName); } // The UTF-8 encoding returned from Encoding.GetEncoding("utf-8") includes the BOM - see Encoding.GetPreamble() // If this file does not have the BOM, then change to an encoder without the BOM so the BOM is not added in // the replace operation if (encoding is UTF8Encoding && !Utils.HasUtf8ByteOrderMark(tempFileName)) { encoding = new UTF8Encoding(false); } if (Utils.CancelSearch) { break; } if (!engine.Replace(tempFileName, item.OrginalFile, searchPattern, replacePattern, searchType, searchOptions, encoding, item.ReplaceItems)) { throw new ApplicationException("Replace failed for file: " + item.OrginalFile); } if (!Utils.CancelSearch) { ProcessedFile(this, new ProgressStatus(false, processedFiles, processedFiles, null, item.OrginalFile)); } File.SetAttributes(item.OrginalFile, File.GetAttributes(tempFileName)); GrepEngineFactory.ReturnToPool(item.OrginalFile, engine); if (Utils.CancelSearch) { // Replace the file Utils.DeleteFile(item.OrginalFile); Utils.CopyFile(tempFileName, item.OrginalFile, true); break; } } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, ex.Message, ex); try { // Replace the file if (File.Exists(tempFileName) && File.Exists(item.OrginalFile)) { Utils.DeleteFile(item.OrginalFile); Utils.CopyFile(tempFileName, item.OrginalFile, true); } } catch { // DO NOTHING } return(-1); } } } finally { GrepEngineFactory.UnloadEngines(); } return(processedFiles); }