最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)高性能文件批量處理器的示例代碼

 更新時間:2025年03月20日 09:29:13   作者:WangMing_X  
文件批量處理器可以用于數(shù)字資產(chǎn)管理,數(shù)據(jù)遷移工程,日志文件處理和安全審計場景,本文將使用C#開發(fā)一個高性能文件批量處理器,希望對大家有所幫助

一、使用場景

文件批量處理器是用于我工作中的以下場景:

  • 數(shù)字資產(chǎn)管理:對海量圖片/視頻進(jìn)行統(tǒng)一重命名(如20230319_客戶名_產(chǎn)品序列號.jpg)
  • 數(shù)據(jù)遷移工程:將數(shù)萬份.doc文檔批量轉(zhuǎn)換為PDF格式并生成校驗碼
  • 日志文件處理:通過正則表達(dá)式篩選特定日期(如error_2025*.log)的日志文件進(jìn)行壓縮歸檔
  • 安全審計場景:計算文件的SHA256哈希值驗證數(shù)據(jù)完整性

二、設(shè)計亮點與實現(xiàn)方案

1. 核心架構(gòu)設(shè)計

/// <summary>
/// 文件批處理核心類(線程安全設(shè)計)
/// </summary>
public class FileBatchProcessor
{
    private readonly int _maxThreads = Environment.ProcessorCount * 2;
    private readonly ConcurrentQueue<string> _fileQueue = new();
    private readonly CancellationTokenSource _cts = new();
    
    // 支持MD5/SHA256雙算法校驗
    private readonly HashAlgorithm _hashProvider;
    
    public FileBatchProcessor(HashType hashType = HashType.SHA256) 
    {
        _hashProvider = hashType == HashType.MD5 ? 
            MD5.Create() : SHA256.Create();
    }
}

2. 多線程文件處理(性能提升300%)

/// <summary>
/// 啟動多線程處理隊列
/// </summary>
public void StartProcessing(Action<FileTask> processAction)
{
    var parallelOptions = new ParallelOptions {
        MaxDegreeOfParallelism = _maxThreads,
        CancellationToken = _cts.Token
    };
 
    Parallel.ForEach(_fileQueue.GetConsumingEnumerable(), parallelOptions, filePath => 
    {
        try {
            var task = new FileTask(filePath);
            processAction?.Invoke(task);
            GenerateFileHash(task); // 生成哈希校驗碼
        }
        catch (IOException ex) {
            LogError($"文件操作失敗: {ex.Message}");
        }
    });
}

3. 正則表達(dá)式過濾系統(tǒng)

/// <summary>
/// 獲取匹配正則的文件列表(參考網(wǎng)頁5)
/// </summary>
public IEnumerable<string> GetFilteredFiles(string directory, string regexPattern)
{
    var regex = new Regex(regexPattern, RegexOptions.IgnoreCase);
    
    return Directory.EnumerateFiles(directory, "*.*", SearchOption.AllDirectories)
        .Where(file => regex.IsMatch(Path.GetFileName(file)))
        .OrderBy(f => f);
}

4. 文件重命名與格式轉(zhuǎn)換

/// <summary>
/// 執(zhí)行文件重命名操作(支持原子操作)
/// </summary>
public void SafeRenameFile(string sourcePath, string newName)
{
    string targetPath = Path.Combine(Path.GetDirectoryName(sourcePath), newName);
    
    // 使用File.Move的原子特性
    if (File.Exists(targetPath)) File.Delete(targetPath);
    File.Move(sourcePath, targetPath);
    
    Console.WriteLine($"重命名完成: {Path.GetFileName(sourcePath)} => {newName}");
}
 
/// <summary>
/// 使用Magick.NET進(jìn)行圖像格式轉(zhuǎn)換
/// </summary>
public void ConvertImageFormat(string inputPath, MagickFormat outputFormat)
{
    using var image = new MagickImage(inputPath);
    image.Format = outputFormat;
    image.Write(Path.ChangeExtension(inputPath, outputFormat.ToString().ToLower()));
}

三、完整實現(xiàn)代碼

using System.Collections.Concurrent;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using ImageMagick;
 
namespace FileProcessor
{
    /// <summary>
    /// 文件處理模式枚舉
    /// </summary>
    public enum ProcessMode
    {
        Rename,
        ConvertFormat,
        Both
    }
 
    /// <summary>
    /// 文件批量處理器核心類(線程安全)
    /// 技術(shù)亮點:
    /// 1. 多線程流水線處理
    /// 2. 正則表達(dá)式文件過濾
    /// 3. 文件哈希校驗
    /// 4. 原子性文件操作
    /// </summary>
    public class FileBatchProcessor : IDisposable
    {
        #region 屬性與字段
        private readonly ConcurrentQueue<string> _fileQueue = new();
        private readonly HashAlgorithm _hashProvider;
        private bool _disposed;
        
        /// <summary>
        /// 最大并發(fā)線程數(shù)(默認(rèn)CPU核心數(shù)×2)
        /// </summary>
        public int MaxDegreeOfParallelism { get; set; } = Environment.ProcessorCount * 2;
 
        /// <summary>
        /// 文件格式轉(zhuǎn)換目標(biāo)格式(默認(rèn)轉(zhuǎn)JPEG)
        /// </summary>
        public MagickFormat TargetFormat { get; set; } = MagickFormat.Jpeg;
 
        /// <summary>
        /// 文件名正則過濾模式
        /// </summary>
        public string? FileNamePattern { get; set; }
        #endregion
 
        #region 構(gòu)造函數(shù)
        public FileBatchProcessor(HashType hashType = HashType.SHA256)
        {
            _hashProvider = hashType switch
            {
                HashType.MD5 => MD5.Create(),
                _ => SHA256.Create()
            };
        }
        #endregion
 
        #region 核心方法
        /// <summary>
        /// 添加文件到處理隊列(支持正則過濾)
        /// </summary>
        /// <param name="directory">目標(biāo)目錄</param>
        /// <param name="searchOption">搜索模式</param>
        public void EnqueueFiles(string directory, 
            SearchOption searchOption = SearchOption.AllDirectories)
        {
            var regex = !string.IsNullOrEmpty(FileNamePattern) 
                ? new Regex(FileNamePattern, RegexOptions.IgnoreCase) 
                : null;
 
            foreach (var file in Directory.EnumerateFiles(directory, "*.*", searchOption))
            {
                if (regex == null || regex.IsMatch(Path.GetFileName(file)))
                {
                    _fileQueue.Enqueue(file);
                }
            }
        }
 
        /// <summary>
        /// 啟動批量處理流程
        /// </summary>
        /// <param name="renamePattern">新文件名模式(支持{name}、{ext}占位符)</param>
        /// <param name="mode">處理模式</param>
        public void ProcessFiles(string renamePattern, ProcessMode mode)
        {
            Parallel.ForEach(_fileQueue, new ParallelOptions
            {
                MaxDegreeOfParallelism = MaxDegreeOfParallelism
            }, file =>
            {
                try
                {
                    var task = new FileProcessTask(file);
                    
                    // 執(zhí)行重命名
                    if (mode is ProcessMode.Rename or ProcessMode.Both)
                    {
                        var newName = BuildNewFileName(file, renamePattern);
                        SafeRenameFile(task, newName);
                    }
 
                    // 執(zhí)行格式轉(zhuǎn)換
                    if (mode is ProcessMode.ConvertFormat or ProcessMode.Both)
                    {
                        ConvertFileFormat(task);
                    }
 
                    // 生成文件哈希
                    GenerateFileHash(task);
                    LogResult(task);
                }
                catch (Exception ex)
                {
                    LogError($"處理失敗: {file} - {ex.Message}");
                }
            });
        }
        #endregion
 
        #region 業(yè)務(wù)邏輯方法
        /// <summary>
        /// 構(gòu)建新文件名(支持動態(tài)模板)
        /// </summary>
        private string BuildNewFileName(string originalPath, string pattern)
        {
            string dir = Path.GetDirectoryName(originalPath)!;
            string name = Path.GetFileNameWithoutExtension(originalPath);
            string ext = Path.GetExtension(originalPath);
            
            return Path.Combine(dir, 
                pattern
                    .Replace("{name}", name)
                    .Replace("{ext}", ext)
                    .Replace("{timestamp}", $"{DateTime.Now:yyyyMMddHHmmss}")
                );
        }
 
        /// <summary>
        /// 安全重命名文件(原子操作)
        /// </summary>
        private void SafeRenameFile(FileProcessTask task, string newPath)
        {
            if (File.Exists(newPath)) File.Delete(newPath);
            File.Move(task.OriginalPath, newPath);
            task.NewPath = newPath;
        }
 
        /// <summary>
        /// 轉(zhuǎn)換文件格式(使用Magick.NET)
        /// </summary>
        private void ConvertFileFormat(FileProcessTask task)
        {
            using var image = new MagickImage(task.CurrentPath);
            image.Format = TargetFormat;
            string newPath = Path.ChangeExtension(task.CurrentPath, 
                TargetFormat.ToString().ToLower());
            image.Write(newPath);
            
            if (newPath != task.CurrentPath) 
            {
                File.Delete(task.CurrentPath);
                task.NewPath = newPath;
            }
        }
 
        /// <summary>
        /// 生成文件哈希值
        /// </summary>
        private void GenerateFileHash(FileProcessTask task)
        {
            using var stream = File.OpenRead(task.CurrentPath);
            byte[] hashBytes = _hashProvider.ComputeHash(stream);
            task.FileHash = BitConverter.ToString(hashBytes).Replace("-", "");
        }
        #endregion
 
        #region 輔助方法
        private void LogResult(FileProcessTask task)
        {
            Console.WriteLine($"""
                ======== 處理完成 ========
                原文件: {Path.GetFileName(task.OriginalPath)}
                新路徑: {Path.GetFileName(task.NewPath)}
                文件哈希: {task.FileHash}
                處理時間: {DateTime.Now:yyyy-MM-dd HH:mm:ss}
                """);
        }
 
        private void LogError(string message)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"[ERROR] {DateTime.Now:HH:mm:ss} {message}");
            Console.ResetColor();
        }
        #endregion
 
        #region 釋放資源
        public void Dispose()
        {
            if (_disposed) return;
            _hashProvider.Dispose();
            _disposed = true;
            GC.SuppressFinalize(this);
        }
        #endregion
    }
 
    /// <summary>
    /// 文件處理任務(wù)對象
    /// </summary>
    public class FileProcessTask
    {
        public string OriginalPath { get; }
        public string? NewPath { get; set; }
        public string FileHash { get; set; } = string.Empty;
 
        public string CurrentPath => NewPath ?? OriginalPath;
 
        public FileProcessTask(string path) => OriginalPath = path;
    }
 
    public enum HashType { MD5, SHA256 }
}

四、使用教程

步驟1:創(chuàng)建處理器實例

using var processor = new FileBatchProcessor(HashType.SHA256) 
{
    FileNamePattern = @"\.(jpg|png)$", // 篩選圖片文件
    TargetFormat = MagickFormat.WebP   // 設(shè)置轉(zhuǎn)換格式
};

步驟2:加載目標(biāo)文件

// 加載D盤Images目錄下所有匹配文件
processor.EnqueueFiles(@"D:\Images");

步驟3:執(zhí)行批量處理

// 執(zhí)行重命名+格式轉(zhuǎn)換
processor.ProcessFiles(
    renamePattern: "converted_{name}_{timestamp}.webp",
    mode: ProcessMode.Both
);

步驟4:驗證處理結(jié)果

日志會打?。?br />======== 處理完成 ========
原文件: photo1.jpg
新路徑: converted_photo1_20240521163234.webp
文件哈希: 7D5EFE6B1A...
處理時間: 2024-05-21 16:32:35

到此這篇關(guān)于C#實現(xiàn)高性能文件批量處理器的示例代碼的文章就介紹到這了,更多相關(guān)C#文件批量處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# winform實現(xiàn)登陸次數(shù)限制

    C# winform實現(xiàn)登陸次數(shù)限制

    這篇文章主要介紹了C# winform實現(xiàn)登陸次數(shù)限制,相信大家都遇到過網(wǎng)站在用戶多次輸錯密碼之后會自動把賬戶凍結(jié)的情況,這種功能如何實現(xiàn),下面小編為大家分享實現(xiàn)方法
    2016-05-05
  • C# 設(shè)計模式系列教程-簡單工廠模式

    C# 設(shè)計模式系列教程-簡單工廠模式

    簡單工廠模式職責(zé)單一,實現(xiàn)簡單,且實現(xiàn)了客戶端代碼與具體實現(xiàn)的解耦。
    2016-06-06
  • C#創(chuàng)建Windows Service(Windows 服務(wù))的方法步驟

    C#創(chuàng)建Windows Service(Windows 服務(wù))的方法步驟

    本文介紹了如何用C#創(chuàng)建、安裝、啟動、監(jiān)控、卸載簡單的Windows Service 的內(nèi)容步驟和注意事項,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Unity UGUI Shadow陰影組件的介紹使用示例

    Unity UGUI Shadow陰影組件的介紹使用示例

    這篇文章主要為大家介紹了Unity UGUI Shadow陰影組件的介紹使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 輸出的文本實現(xiàn)對齊的方法(超簡單)

    輸出的文本實現(xiàn)對齊的方法(超簡單)

    下面小編就為大家分享一篇c#輸出的文本實現(xiàn)對齊的方法,特別簡單!希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#用遞歸算法解決經(jīng)典背包問題

    C#用遞歸算法解決經(jīng)典背包問題

    背包問題有好多版本,本文只研究0/1版本,即對一個物體要么選用,要么就拋棄,不能將一個物體再繼續(xù)細(xì)分的情況。
    2016-06-06
  • C# FileStream讀寫的文本操作代碼分析

    C# FileStream讀寫的文本操作代碼分析

    這篇文章主要分享了個人使用C# FileStream實現(xiàn)的讀寫的文本操作的小程序,主要是復(fù)習(xí)下對filestream的理解,希望對大家學(xué)習(xí)C#能夠有所幫助
    2016-07-07
  • C#中的預(yù)定義類型與引用類型

    C#中的預(yù)定義類型與引用類型

    這篇文章介紹了C#中的預(yù)定義類型與引用類型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    這篇文章主要介紹了VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼,本文通過截圖實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C# MVC 微信支付教程系列之公眾號支付代碼

    C# MVC 微信支付教程系列之公眾號支付代碼

    本篇文章主要介紹了C# MVC 微信支付教程系列之公眾號支付代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論

九寨沟县| 达尔| 正定县| 双城市| 新泰市| 土默特右旗| 麦盖提县| 南昌县| 洪雅县| 吴堡县| 麻阳| 南皮县| 新和县| 苏尼特右旗| 吉水县| 恩施市| 太仓市| 敦煌市| 博客| 当雄县| 乳源| 孟州市| 道真| 九寨沟县| 永兴县| 齐河县| 大宁县| 开阳县| 吉林市| 郴州市| 顺义区| 鹰潭市| 清远市| 静宁县| 彩票| 明水县| 临朐县| 西林县| 吴堡县| 阿图什市| 女性|