示例#1
0
文件: GrepCore.cs 项目: zer/dnGrep
        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);
        }