C# 批量处理文件(SVN版本控制版)

Posted 寻找星空的孩子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 批量处理文件(SVN版本控制版)相关的知识,希望对你有一定的参考价值。

最近公司有个批量压缩图片的任务交给我。

对于IO的是操作,我不是很擅长,自己比较shui  。不管怎么样,经过的不懈的努力,今天终于完成了。

所以打算分享一下。

任务要求:

给你一个文件夹,把该文件夹下的所有.png文件进行压缩,然后保存到相对文件夹的镜像对应子文件夹目录下,

并支持SVN版本的更替的增量压缩(即:修改或新增的图片才压缩)


解决方案:

网上有很多压缩的方式,也很繁杂,我也尝试过很多,其中对tinifypng.com网址的压缩还是比较满意的。

网址:https://tinypng.com/

操作:直接把想压缩的图片拖上去就可以了。(当然你不嫌麻烦话)

如果做批量上传处理和下载,就是本次任务的意义了。

实现过程: 按照 https://tinypng.com/developers/reference/dotnet 网站提供的API reference (这里我用的是.Net的API)

1. 首先 添加 NuGet package. (项目右键 管理NuGet程序包) 搜索tinify 下载安装 即可调用

2.去网站上注册申请Key(每个key每月可免费压缩500张图) 

3.压缩过程采用异步形式,其他的一些图片的压缩格式,裁剪等参看官网说明 。

4.可以 Tinify.CompressionCount  知道你当月剩余可压缩次数


如果你有很多图片可以购买会员提高次数,也可以多注册一个帐号,轮询使用。 

下面是关键代码

做一个递归查找文件夹下的图片,递归处理上传压缩

        public static void RecursiveFolder(DirectoryInfo theFolder, DirectoryInfo outFolder, string outPath)
        
            if (theFolder == null)
                return;
            DirectoryInfo[] dirInfo = theFolder.GetDirectories();
            if (dirInfo.Length > 0)
            
                foreach (var dir in dirInfo)
                
                    if (!dir.Name.ToLower().EndsWith("svn")) 
                    
                        var th = outFolder.CreateSubdirectory(dir.Name);
                        RecursiveFolder(dir, th, outPath + "\\\\" + dir.Name);
                    

                
            
            foreach (FileInfo file in theFolder.GetFiles("*.png"))
            
                sub.GetWCInfo(file.FullName, true, true);
                if (sub.IsSvnItem)
                
                    string version;
                    if (fileRevisionDict.TryGetValue(file.FullName, out version))
                    
                        if (!version.Equals(sub.Revision.ToString()))
                        
                            fileRevisionDict[file.FullName] = sub.Revision.ToString();
                            Console.WriteLine("RecursiveFolder " + file.FullName + " version " + sub.Revision + " != " + version + " Request the compression");
                            Solve(file.FullName, outPath + "\\\\" + file.Name);
                        
                        else
                        
                            Console.WriteLine("RecursiveFolder " + file.FullName + " version " + sub.Revision + " == " + version);
                        
                    
                    else
                    
                        fileRevisionDict.Add(file.FullName, sub.Revision.ToString());
                        Console.WriteLine("RecursiveFolder " + file.FullName + " version " + sub.Revision + " (new)Request the compression");
                        Solve(file.FullName, outPath + "\\\\" + file.Name);
                    
                
                else
                
                    Console.WriteLine("RecursiveFolder not versioned");
                

            


        

核心代码二: (压缩处理)

        public static async void Solve(string fileFullName, string outFile)
        
            try
            
                var expiredKey = tinifyKeysArray[expiredKeysCnt];
                Tinify.Key = expiredKey;
                if (expiredKeysCnt > tinifyKeysArray.Count)
                
                    Console.WriteLine("Solve All key times are used up this month.");
                    Console.WriteLine("Solve Welcome back next month.");
                    return;
                

                try
                
                    Console.WriteLine("Solve Try: 0 ", fileFullName);
                    var source = Tinify.FromFile(fileFullName);
                    sumUploadCnt++;
                    Console.WriteLine(" ----------------- await : start ----------------- 0", sumUploadCnt);
                    var copyrighted = source.Preserve("copyright", "creation");
                    await copyrighted.ToFile(outFile);
                    sumDownloadCnt++;
                    Console.WriteLine(" ----------------- await : end  ----------------- 0", sumDownloadCnt);
                    if (sumDownloadCnt == sumUploadCnt)
                    
                        var compressionsThisMonth = Tinify.CompressionCount;
                        if (compressionsThisMonth >= thisMonthCnt)
                        
                            expiredKeysCnt++;
                        
                        Console.WriteLine("Solve This key has been compressed 0 times, remaining 1 times this month.",
                            compressionsThisMonth, thisMonthCnt - compressionsThisMonth);
                        Console.WriteLine("Solve The task finished, Welcome to use again.");
                    
                
                catch (AccountException e)
                
                    Console.WriteLine("Solve The AccountException error message is: " + e.Message);
                    expiredKeysCnt++; //use next key
                    Solve(fileFullName, outFile);
                
                catch (ClientException e)
                
                    Console.WriteLine("Solve The ClientException error message is: " + e.Message);
                
                catch (ServerException e)
                
                    Console.WriteLine("Solve The ServerException error message is: " + e.Message);
                
                catch (ConnectionException e)
                
                    Console.WriteLine("Solve The ConnectionException error message is: " + e.Message);
                
                catch (System.Exception e)
                
                    Console.WriteLine("Solve The System.Exception error message is: " + e.Message);
                
            
            catch (System.Exception e)
            
                Console.WriteLine("Solve Validation of API key failed : " + e.Message);
                tinifyKeysArray.RemoveAt(expiredKeysCnt);
                Solve(fileFullName, outFile);
            

        

其中 tinifyKeysArray 是个Key池

        private static List<string> tinifyKeysArray = new List<string>()
        
            "你的Key1"
        ;

其他就是一个SNV版本号的读取

sub.GetWCInfo();

添加SubWCRevCom.exe引用,

using TinifyAPI;

using LibSubWCRev;

即可使用。

至于读写版本控制文件就不详述了,可以按照自己喜欢的格式写,就是注意一下目录中文的话,可能会乱码问题,so 压缩路径和导出路径最好都是全英文的,包括版本控制路径

最后写一个bat脚本以后就可以双击运行了。很方便


@echo off
c:
cd \\batch\\Debug
TinifyPng F:\\SVN\\blackjack\\doc\\minister C:\\Users\\Administrator\\Desktop\\temp\\dest C:\\batch\\TinifyPng.txt

简单解释下:

首先进入C盘\\batch\\Debug 目录,(上面程序运行后生成的Debug目录的备份目录)

Tinify 需要压缩文件的总目录路径 导出文件的目录路径 版本记录文件的路径

有兴趣的同学可以和我讨论,留言。

注:我的代码之后会更新在Github上,小工具也会上传,小工具做了限制,只能是有SVN版本号的才会压缩。

小工具:http://download.csdn.net/download/u010579068/10262653

以上是关于C# 批量处理文件(SVN版本控制版)的主要内容,如果未能解决你的问题,请参考以下文章

SVN中如何去除版本控制器

C# Winform版批量压缩图片程序

工作中可能用到的——集中式版本控制系统SVN

工作中可能用到的——集中式版本控制系统SVN

如何去除SVN版本信息

SVN批量移动文件,并保留版本日志