刪除重覆文件的程式

来源:http://www.cnblogs.com/preacher/archive/2016/11/17/6073664.html
-Advertisement-
Play Games

刪除重覆的文件功能 使用方法: 建一個BAT文件,如1.bat,裡面寫入:RemoveDuplicate.exe path1 path2 (或者在命令行下輸入以上內容) 其中path1表示原文件夾,path2表示要檢測和刪除的文件夾 例如文件夾path1中有:1.txt、2.txt、3.txt、4. ...


刪除重覆的文件功能

使用方法:

建一個BAT文件,如1.bat,裡面寫入:RemoveDuplicate.exe    path1     path2   (或者在命令行下輸入以上內容)

其中path1表示原文件夾,path2表示要檢測和刪除的文件夾

例如文件夾path1中有:1.txt、2.txt、3.txt、4.txt、5.txt

例如文件夾path2中有:4.txt、5.txt、6.txt、7.txt、8.txt

(path1和path2中4.txt、5.txt是同名同大小的文件)

 

執行  RemoveDuplicate.exe    path1     path2 

之後:

文件夾path1中有:1.txt、2.txt、3.txt、4.txt、5.txt

文件夾path2中有:6.txt、7.txt、8.txt

其中文件夾path2中的4.txt、5.txt會被刪除。

 

寫此方法的目的:

  本人有兩台開發機和一臺家用機,平時很多源代碼和設計文件在各個機器上轉來轉去,複製很多份,最近發現其中一臺開發機容量已經爆滿,想著把兩台開發機和家用機上面的所有源代碼和設計文檔做一個去重覆的處理(兩台開發機上都有類似網蟲的監控服務,會監控和下載網路上的很多資源),只保留其中一套,例如開發機A、開發機B、家用機C,以“開發機A”作為基礎,去刪除“開發機B”、“家用機C”上重覆的源代碼和各種文檔。

-----------------------------------------------------------

可將本程式放入 “開發機A”,在控制臺下執行   RemoveDuplicate.exe    pathA   ,其中  pathA   表示基礎路徑(以其中的源代碼和各種文檔作為參照),執行之後會生成一個all.conf文件,其中記載“開發機A” pathA路徑下所有文件的信息(名稱、路徑、大小);

例如將RemoveDuplicate.exe放入“開發機A”的D盤符下

控制台輸入命令 cd \d d:\   切換到D盤符

控制台輸入  RemoveDuplicate.exe   d:\     或者    RemoveDuplicate.exe   "d:\"

會在D盤下生成一個all.conf文件

 

-------------------------------------------------------------

然後將本程式RemoveDuplicate.exe和all.conf文件放入“開發機B”,在控制臺下執行 RemoveDuplicate.exe   "an exists directory"  pathB ,其中 "an exists directory" 表示一個不存在的文件路徑,可以直接寫成" "(空字元串千萬不要省略引號),或者寫成  aaaaaaaaa 等一個不存在的路徑,pathB 表示“開發機B”需要被檢查和刪除的文件夾路徑;

例如將RemoveDuplicate.exe放入“開發機B”的D盤符下

控制台輸入命令 cd  \d  d:\   切換到D盤符

控制台輸入  RemoveDuplicate.exe   " "   d:\    e:\  或者 RemoveDuplicate.exe   " "   "d:\"   "e:\"

會將“開發機B”上d:\和e:\路徑下與all.conf中相同的文件給刪除。

然後控制台輸入  RemoveDuplicate.exe   d:\    將“開發機B”的D盤符下所有文件都計入all.conf中

然後控制台輸入  RemoveDuplicate.exe   e:\    將“開發機B”的E盤符下所有文件都計入all.conf中

 

-------------------------------------------------------------

然後將本程式RemoveDuplicate.exe和all.conf文件放入“家用機C”,在控制臺下執行 RemoveDuplicate.exe   "an exists directory"  pathC(其餘同上);

例如將RemoveDuplicate.exe放入“家用機C”的D盤符下

控制台輸入命令 cd  \d  d:\   切換到D盤符

控制台輸入  RemoveDuplicate.exe   " "   e:\  或者 RemoveDuplicate.exe   " "   "e:\"

會將“家用機C”上e:\路徑下與all.conf中相同的文件給刪除。

 

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace RemoveDuplicate
{
    public class MFile
    {
        public string Name { set; get; }
        public string FullName { set; get; }
        public long Length { set; get; }
    }

    class Program
    {
        static List<MFile> listFiles = new List<MFile>();
        static bool changed = false;
        static bool state = false;
        const string confPath = "all.conf";

        static void Main(string[] args)
        {
            try
            {
                if (File.Exists(confPath))
                {
                    listFiles = DeserializeFromXml<List<MFile>>(confPath);
                }

                if (listFiles == null)
                {
                    listFiles = new List<MFile>();
                }

                if (args != null)
                {
                    foreach (string arg in args)
                    {
                        Cycle(arg);
                        state = true;
                        ConsoleWriteLine("*************\t" + arg + "\t****************", ConsoleColor.Red);
                    }
                }

                Console.ReadLine();
                if (changed)
                {
                    SerializeToXml<List<MFile>>(confPath, listFiles);
                }

            }
            catch (Exception ex)
            {
                ConsoleWriteLine("Main Exception : " + ex.StackTrace, ConsoleColor.Red);
            }
        }

        static bool Cycle(string path)
        {
            int fileCount = 0;
            int folderCount = 0;

            try
            {
                if (path == null || path == "" || Directory.Exists(path))
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                ConsoleWriteLine("Directory.Exists(" + path + ") Exception : " + ex.StackTrace, ConsoleColor.Yellow);
            }

            string[] files = null;
            try
            {
                files = Directory.GetFiles(path);
            }
            catch (Exception ex)
            {
                ConsoleWriteLine("Directory.GetFiles(" + path + ") Exception : " + ex.StackTrace, ConsoleColor.Yellow);
            }

            if (files != null && (fileCount = files.Length) > 0)
            {
                foreach (string file in files)
                {
                    try
                    {
                        FileInfo fi = new FileInfo(file);

                        if (state)
                        {
                            List<MFile> ls = listFiles.FindAll((f) => { return fi.Name == fi.Name && f.Length == fi.Length; });
                            if (ls != null && ls.Count > 0)
                            {
                                Console.WriteLine("delete file : " + fi.FullName);
                                fi.Attributes = fi.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
                                fi.Delete();
                                fileCount--;
                            }
                        }
                        else
                        {
                            MFile mf = new MFile
                            {
                                Name = fi.Name,
                                FullName = fi.FullName,
                                Length = fi.Length
                            };
                            listFiles.Add(mf);
                            changed = true;
                        }
                    }
                    catch (Exception ex)
                    {
                        ConsoleWriteLine("FileInfo.Delete(" + file + ") Exception : " + ex.StackTrace, ConsoleColor.Red);
                    }
                }
            }

            string[] folders = null;
            try
            {
                folders = Directory.GetDirectories(path);
            }
            catch (Exception ex)
            {
                ConsoleWriteLine("Directory.GetDirectories(" + path + ") Exception : " + ex.StackTrace, ConsoleColor.Yellow);
            }

            if (folders != null && (folderCount = folders.Length) > 0)
            {
                foreach (string folder in folders)
                {
                    if (Cycle(folder))
                    {
                        try
                        {
                            DirectoryInfo di = new DirectoryInfo(folder);
                            if (di.GetFiles().Length == 0 && di.GetDirectories().Length == 0)
                            {
                                Console.WriteLine("delete " + di.FullName);
                                di.Attributes = di.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
                                di.Delete();
                                folderCount--;
                            }
                        }
                        catch (Exception ex)
                        {
                            ConsoleWriteLine("DirectoryInfo.Delete(" + path + ") Exception : " + ex.StackTrace, ConsoleColor.Red);
                        }
                    }
                }
            }

            return (folderCount <= 0 && fileCount <= 0);
        }

        static void ConsoleWriteLine(string msg, ConsoleColor cc)
        {
            var v = Console.ForegroundColor;
            Console.ForegroundColor = cc;
            Console.WriteLine(msg);
            Console.ForegroundColor = v;
        }

        public static void SerializeToXml<T>(string filePath, T obj)
        {
            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath))
            {
                System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
                xs.Serialize(writer, obj);
            }
        }

        public static T DeserializeFromXml<T>(string filePath)
        {
            if (!System.IO.File.Exists(filePath))
                throw new ArgumentNullException(filePath + " not Exists");

            using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath))
            {
                System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
                return (T)xs.Deserialize(reader);
            }
        }
        //static bool isValidFileContent(string filePath1, string filePath2)
        //{
        //    using (HashAlgorithm hash = HashAlgorithm.Create())
        //    {
        //        using (FileStream file1 = new FileStream(filePath1, FileMode.Open), file2 = new FileStream(filePath2, FileMode.Open))
        //        {
        //            byte[] hashByte1 = hash.ComputeHash(file1);
        //            byte[] hashByte2 = hash.ComputeHash(file2);
        //            string str1 = BitConverter.ToString(hashByte1); 
        //            string str2 = BitConverter.ToString(hashByte2);
        //            return (str1 == str2);
        //        }
        //    }
        //} 
    }
}
刪除重覆文件的程式

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文版權歸博客園和作者吳雙共同所有,轉載和爬蟲請註明原文地址:www.cnblogs.com/tdws 首先分享幾個振奮人心的新聞: 1.谷歌已經宣佈加入.NET基金會 2.微軟加入Linux基金會,繼續對Linux示好。換了CEO就是不一樣 3.微軟發佈VS For Mac! 第一步 下載dll ...
  • 從今天開始,正式進入Asp.net Core的開發,估計最近一段時間會經常寫博客了,記錄學些Asp.net Core中遇到的各種坑。 第一個問題:通過core編寫的webapi,預設返回的json會自動格式化為駝峰樣式,並沒有按照具體的類名來返回,如何讓其按照類名返回呢? 在Startup.cs全局 ...
  • 恢復內容開始 如何做到將客戶伺服器資料庫的備份,下載到本地的雲服務上? 在開發這個程式中中途也遇到了一下問題,下麵我將自己如何進解決的辦法寫出來供大家參考。 一.首先我需要進行描述一下問題: 1.比如有兩台伺服器A,B(雲伺服器) 將A中的伺服器中的資料庫的備份進行下載到B的雲服務中並保存。 2.當 ...
  • 感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高抬貴手“推薦一下”吧!你的精神支持是博主強大的寫作動力以及轉載收藏動力。歡迎轉載! 版權聲明:本文原創發表於 【請點擊連接前往】 ,未經作者同意必須保留此段聲明!如有侵權請聯繫我刪帖處理! 我的博客:http://www.cnblogs.com/GJM6/ ...
  • 字元串轉組件名 字元串轉變數名 或 ...
  • EntityFramework 一對一關係映射有很多種,比如主鍵作為關聯,配置比較簡單,示例代碼: 上面代碼表示 Teacher 和 Student 一對一關係,Fluent API 配置如下: 測試代碼: 生成 SQL 代碼: 另一種 Fluent API 配置如下: 執行同樣測試代碼,生成 SQ ...
  • ...
  • 本文主要涉及兩個概念: 阿裡雲OSS:對象存儲(Object Storage Service,簡稱OSS),是阿裡雲對外提供的海量、安全和高可靠的雲存儲服務。 bootstrap-fileinput:An enhanced HTML 5 file input for Bootstrap 3.x wi ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...