zoukankan      html  css  js  c++  java
  • 清理0字节文件和文件夹

      最近突然感觉到个人的开发机各种慢,也是啊,从我上大学时起至今,这台老古董跟了我七年多了,还好每年我会亲手给它做一两次的清理和养护,所以它现在依然可以玩命的为我工作。如果我没记错,距离我上一次做系统有两年多了,查看了一下磁盘的情况,window 2003系统 ,系统盘占了45G(满50G,这个里面还包括4G的虚拟内存),其他硬盘上也堆积了各种文件夹和文件,o(︶︿︶)o 唉,删了吧,不舍得,要么是自己做的,要么是辛苦弄来的;不删吧,那就是一堆杂乱无章的垃圾。要怎么办?

      给自己先立下这么个规矩

         1.文件夹深度不能超过5

         2.不保留0字节文件和文件夹

         3.执行磁盘碎片整理(文件压缩也是把散碎文重组的一个好方式,然后再解压缩,不懂的就当我是在胡咧咧吧

    究竟这几步应该如何快速做到呢?


    1.文件夹深度不能超过5

    cmd  命令有一个  tree , 侬晓得伐?

    C:UsersAdministrator>tree "D:MoontestMoontest删除0大小文件和空文件夹" /f
    文件夹 PATH 列表
    卷序列号为 A043-7C6D
    D:MOONTESTMOONTEST删除0大小文件和空文件夹
    │  Program.cs
    │  删除0大小文件和空文件夹.csproj
    │
    ├─bin
    │  ├─Debug
    │  │      删除0大小文件和空文件夹.exe
    │  │      删除0大小文件和空文件夹.pdb
    │  │      删除0大小文件和空文件夹.vshost.exe
    │  │      删除0大小文件和空文件夹.vshost.exe.manifest
    │  │
    │  └─Release
    ├─Controls
    │      MyButton.cs
    │
    ├─obj
    │  └─x86
    │      └─Debug
    │          │  1111.csproj.FileListAbsolute.txt
    │          │  2048.csproj.FileListAbsolute.txt
    │          │  DesignTimeResolveAssemblyReferences.cache
    │          │  DesignTimeResolveAssemblyReferencesInput.cache
    │          │  GenerateResource.read.1.tlog
    │          │  GenerateResource.write.1.tlog
    │          │  ResolveAssemblyReference.cache
    │          │  删除0大小文件和空文件夹.csproj.FileListAbsolute.txt
    │          │  删除0大小文件和空文件夹.exe
    │          │  删除0大小文件和空文件夹.Properties.Resources.resources
    │          │
    │          └─TempPE
    │                  Properties.Resources.Designer.cs.dll
    │
    └─Properties
            AssemblyInfo.cs
            Resources.Designer.cs
            Resources.resx
            Settings.Designer.cs
            Settings.settings
    
    
    C:UsersAdministrator>

         这个层次分明了,如果实在太多,可以输入在命令后加上 >> d: esult.txt 即是

    tree "D:MoontestMoontest删除0大小文件和空文件夹" /f >> d: esult.txt

    这种方式把结果导出到一个文件中查看。如果深度太大的,可以手动处理下,这个尽量不要写代码自动化处理,毕竟你不能把你的思维写到计算机里面,文件或删或合并或移位,还是人工的好点,当然我说的是对自己有价值有感情的东西,毕竟某些东西视同己出。


    2.不保留0字节文件和文件夹

      这个不管我们采用什么样的系统清理工具,清理工具考虑系统稳定性,一般不会删除不在“花名册”中的0字符文件和文件夹。这样就可能导致我们曾经在安装删除时,系统中保留了大量的卸载后余下的垃圾文件(0字符文件和文件夹),久而久之,看到一堆堆我不认识的东西,心里特别不爽,看到一个,干掉一个;但是这种方式也太慢了。要怎么办呢?自己写个清理方法吧,呵呵。

      我自己提供一下删除0字符文件和文件夹的小代码,比较简单,不解释代码了,分成三段,根据喜好索取,我个人偏好Class2

    using System;
    using System.Collections.Generic;
    using System.IO;
    
    namespace 删除0大小文件和空文件夹
    {
        class Program
        {
            /*
                Class1 和 Class2 的形式是一样的,只是删除方式不一样
                Class2 和 Class3 的删除方式是一样的,只是形式不一样
                Class1 先检索出所有文件夹,从末端文件夹开始删除0字节文件和文件夹
                Class2 和 Class3 检查一个文件夹,先删除0字节文件,然后检索文件夹,重复以上过程,最后从末端文件夹开始删除文件夹
             */
            static void Main(string[] args)
            {
                AppDomain.CurrentDomain.UnhandledException += (s, e) => { File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "error.log", DateTime.Now.ToString() + "	" + e.ExceptionObject.ToString() + Environment.NewLine); };
    
                Class1 c1 = new Class1(args);
                Class2 c2 = new Class2(args);
                Class3 c3 = new Class3(args);
            }
        }
    
        public class Class1
        {
            public Class1(string[] args)
            {
                Queue<string> queue = new Queue<string>();
                Stack<string> stack = new Stack<string>();
    
                if (args.Length > 0)
                {
                    foreach (var item in args)
                    {
                        queue.Enqueue(item);
                        stack.Push(item);
                    }
                }
                else
                {
                    string rootPath = AppDomain.CurrentDomain.BaseDirectory;
                    queue.Enqueue(rootPath);
                    stack.Push(rootPath);
                }
    
                while (queue.Count > 0)
                {
                    string curPath = queue.Dequeue();
                    string[] folders = null;
                    try
                    {
                        folders = Directory.GetDirectories(curPath);
                    }
                    catch { }
    
                    if (folders != null && folders.Length > 0)
                    {
                        foreach (var item in folders)
                        {
                            queue.Enqueue(item);
                            stack.Push(item);
                        }
                    }
                }
    
                while (stack.Count > 0)
                {
                    string curPath = stack.Pop();
                    string[] files = null;
                    try
                    {
                        files = Directory.GetFiles(curPath);
                    }
                    catch { }
    
                    int filecount = 0;
    
                    if (files != null && files.Length > 0)
                    {
                        filecount = files.Length;
                        foreach (var item in files)
                        {
                            FileInfo finfo = new FileInfo(item);
                            if (finfo.Length <= 0)
                            {
                                try
                                {
                                    finfo.Delete();
                                    filecount--;
                                    Console.WriteLine("delete file : " + finfo.FullName);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex);
                                }
                            }
                        }
                    }
    
                    if (filecount == 0)
                    {
                        try
                        {
                            Directory.Delete(curPath);
                            Console.WriteLine("delete folder : " + curPath);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                    }
                }
    
                Console.WriteLine("清理完毕!!!");
                Console.ReadKey();
            }
        }
    
        public class Class2
        {
            public Class2(string[] args)
            {
                Queue<string> queue = new Queue<string>();
                Stack<string> stack = new Stack<string>();
    
                if (args.Length > 0)
                {
                    foreach (var item in args)
                    {
                        queue.Enqueue(item);
                        stack.Push(item);
                    }
                }
                else
                {
                    string rootPath = AppDomain.CurrentDomain.BaseDirectory;
                    queue.Enqueue(rootPath);
                    stack.Push(rootPath);
                }
    
                while (queue.Count > 0)
                {
                    string curPath = queue.Dequeue();
    
                    string[] files = null;
    
                    try
                    {
                        files = Directory.GetFiles(curPath);
                    }
                    catch { }
    
                    if (files != null && files.Length > 0)
                    {
                        foreach (var item in files)
                        {
                            FileInfo finfo = new FileInfo(item);
                            if (finfo.Length <= 0)
                            {
                                try
                                {
                                    finfo.Delete();
                                    Console.WriteLine("delete file : " + finfo.FullName);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex);
                                }
                            }
                        }
                    }
    
                    string[] folders = null;
                    try
                    {
                        folders = Directory.GetDirectories(curPath);
                    }
                    catch { }
    
                    if (folders != null && folders.Length > 0)
                    {
                        foreach (var item in folders)
                        {
                            queue.Enqueue(item);
                            stack.Push(item);
                        }
                    }
                }
    
                while (stack.Count > 0)
                {
                    string curPath = stack.Pop();
    
                    try
                    {
                        Directory.Delete(curPath);
                        Console.WriteLine("delete folder : " + curPath);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
    
                Console.WriteLine("清理完毕!!!");
                Console.ReadKey();
            }
        }
    
        public class Class3
        {
            public Class3(string[] args)
            {
                if (args.Length == 0)
                {
                    args = new string[] { AppDomain.CurrentDomain.BaseDirectory };
                }
    
                foreach (var item in args)
                    Delete(item);
    
                Console.WriteLine("清理完毕!!!");
                Console.ReadKey();
            }
    
            public void Delete(string path)
            {
                string[] files = null;
    
                try
                {
                    files = Directory.GetFiles(path);
                }
                catch { }
    
                if (files != null && files.Length > 0)
                {
                    foreach (var item in files)
                    {
                        FileInfo finfo = new FileInfo(item);
                        if (finfo.Length <= 0)
                        {
                            try
                            {
                                finfo.Delete();
                                Console.WriteLine("delete file : " + finfo.FullName);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex);
                            }
                        }
                    }
                }
    
                string[] folders = null;
                try
                {
                    folders = Directory.GetDirectories(path);
                }
                catch { }
    
                if (folders != null && folders.Length > 0)
                    foreach (var item in folders)
                        Delete(item);
    
                try
                {
                    Directory.Delete(path);
                    Console.WriteLine("delete folder : " + path);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
    }
    小代码

      想用拿去编译一下就好,想清理哪个磁盘或者文件夹,只需把生成程序copy过去run就好,当然也可以加参数指定路径。例如写个1.cmd文件,在里面写入

    call  ..这里写生成程序父路径生成程序.exe   "c:"   "D:flash cs6完全自学教程"  "E:Erlang项目"   ,

    然后运行下1.cmd(别怪小弟太啰嗦)。

    现在话题又扯回来了,刚刚我不是还说,很多系统清理工具,为了系统的稳定性,不会删除非“花名册”中的0字符文件和文件夹,我现在这么搞,系统稳定性不是大受威胁吗?

    告诉你,如果你用的是个人计算机,尽管删吧,很多健壮性很好的系统程序都有文件自恢复能力(这一点在开发中很重要,配置文件被误删,或者是无法被程序识别,程序要有文件自恢复能力),不怕啦。但是这种方式绝对不允许用来清理正在运行服务器,除非你觉得脖子够粗,头掉不下来。


    3.执行磁盘碎片整理

      这个就简单了,我喜欢使用defraggler,执行速度非常快,应该和ccleaner出自同一家族;当然也可以使用系统自带的磁盘整理工具,但是有点偏耗时;如果文件比较大,对连续性要求比较高的话,可以使用压缩文件的方式。


          最终,通过删除、移动、合并方式。终于把C盘整理出10G剩余空间,其他盘也做了重复文件处理(重复文件处理比较简单,我这边是读取磁盘所有文件,将 文件创建时间和文件大小连接 并 文件路径,作为key-value插入哈希表,下次遇到重复键的,对比下文件特征(当文件创建时间和文件大小相等,从两个文件中随机取同位符,匹配是否相等,用来断定是否同一个文件),是同一个文件删除重复)。

  • 相关阅读:
    day09总结
    day09作业
    删除循环中选中的id
    数组套数组 获取数据
    vue for each循环出来数组的某一项 再重新合并成一个新数组
    全是没见过的
    vue element 分页
    解决iphonex屏幕过长背景图片或者放在元素里面的图片不能铺满的问题
    实在自动现在APK,微信跳浏览器下载
    js判断是否在微信浏览器中打开
  • 原文地址:https://www.cnblogs.com/preacher/p/4028916.html
Copyright © 2011-2022 走看看