C盘瘦身记
这个周五经手了好多资料,过程中偶然看到C盘盘符容量条变成了红色,顿时心里一紧,因为最近的确装卸过几个软件,但是记得之前还有好大空间的,怎么突然就没有了,随即开始了给C盘瘦身,360的那些工具没用过,也没想起来用优化大师,就直接自己写了程序分析了C盘的文件夹和文件:
1、遍历文件获取文件和文件夹占用空间信息,
2、重新整理整个统计列表,数据格式化,根据需求重新分析文件列表,查找占用空间大的文件夹及相关文件,
1的实现:
开始时也觉得遍历和统计C盘各文件的大小和路径的需求应该有人实现了,但是没找到,还是自己写了一个:
(快有一年没写程序了,很多处理逻辑都忘了,代码不规矩的地方,还望多多担待,帮忙指正,)
下面代码用java实现,完成第一步工作,

1 public class Dir { 2 3 public static ArrayList<FileSpace> fileList = new ArrayList<FileSpace>(); 4 5 public static void main(String[] args) { 6 7 File dir = new File("C:/"); 8 if(!dir.exists()){//打开文件异常,健壮性检测 9 throw new RuntimeException("文件不存在!"); 10 } 11 12 GetFileSpace(dir); 13 //需要对列表fileList进行去重, 14 ArrayList<FileSpace> fileList2 = new ArrayList<FileSpace>(); 15 Iterator<FileSpace> it = fileList.iterator(); 16 while(it.hasNext()){ 17 FileSpace t = it.next(); 18 if (!fileList2.contains(t)) { 19 fileList2.add(t); 20 } 21 } 22 //2为目标数组 23 printList(new File("E:","FilesInfo2.txt"), fileList2); 24 25 //输出结束标识 26 System.out.println("All Right."); 27 } 28 29 private static double GetFileSpace(File dir) { 30 //直接递归计算文件夹及文件大小,输出到数组, 31 double len = 0; 32 File[] files = dir.listFiles(); 33 try { 34 if (files == null){ 35 return 0; 36 } 37 38 } catch (Exception e) { 39 40 System.out.println("dir:"+dir); 41 System.out.println("files:"+files); 42 } 43 44 for(File f: files){ 45 if (f.isDirectory() && f.exists()) { 46 //文件夹 47 len = GetFileSpace(f) + len; 48 // System.out.println("dir."+ f.getAbsolutePath()+ "..." + len); 49 } 50 else if (f.isFile() && f.exists()) { 51 //文件 52 len = f.length() + len; 53 // System.out.println("file." + f.getAbsolutePath()); 54 } 55 // System.out.println("len++." + dir.getAbsolutePath()+"-----len:"+new DecimalFormat("#,##0.00").format(len)); 56 } 57 58 FileSpace fs = new FileSpace(); 59 fs.path = dir.getAbsolutePath(); 60 61 fs.length = len; 62 fileList.add(fs); 63 // System.out.println("7777."+ f.path+ "..." + f.length); 64 65 return len; 66 67 } 68 69 private static void printList(File aimDir, ArrayList<FileSpace> list) { 70 BufferedWriter br = null; 71 try { 72 br = new BufferedWriter(new FileWriter(aimDir)); 73 for(FileSpace f : list){ 74 75 br.write(String.format("%012d",Math.round(f.length))+ "********" +f.path); 76 br.newLine(); 77 br.flush(); 78 } 79 } catch (IOException e) { 80 throw new RuntimeException("写入失败!"); 81 }finally{ 82 if(br != null){ 83 try { 84 br.close(); 85 } catch (IOException e) { 86 throw new RuntimeException("文件关闭失败!"); 87 } 88 } 89 } 90 } 91 92 }
之后实现2,用Python重新整理数据,计算容量,统计超过500M的文件夹,

1 # -*- coding: utf-8 -*- 2 """ 3 Created on Sun Nov 13 10:11:17 2016 4 5 @author: Andy 6 """ 7 def main(): 8 infile = open(r"E:/FilesInfo2.txt") 9 10 #000006929685********C:\Anaconda\tcl 11 12 lines = infile.readlines() 13 infile.close() 14 15 fileInfo = [] 16 for l in lines: 17 space,path = l.split('********') 18 #大小限制 19 #限制为500M 20 if float(space) <= 536870912: 21 continue 22 #转换space到M,G级别 23 space = turnUnit(space) 24 fileInfo.append([space,path]) 25 26 # print fileInfo 27 28 #formatPrint(fileInfo) 29 outPut(fileInfo) 30 31 32 def outPut(fileInfo): 33 #将传入的列表输出到文件 34 ofile = open(r'E:\result_500M_2.txt','w') 35 outList = '' 36 fileInfo.reverse() 37 for l in fileInfo: 38 s = "%s---%s\n"%(l[0],l[1]) 39 outList = outList+s 40 41 ofile.write(outList) 42 ofile.close() 43 44 def formatPrint(fileList): 45 #逐条输出列表数据, 46 for l in fileList: 47 print "%s---%s"%(l[0],l[1]) 48 49 def turnUnit(number): 50 #将传入的KB转换为MB或者GB单位, 51 result = '' 52 #1、测试是否可以转化为GB 53 GB = round(float(number)/(1024*1024*1024),2) 54 if GB > 0.5: 55 result = str(GB) + "GB" 56 else: 57 #2、测试是否可以转化为MB 58 MB = round(float(number)/(1024*1024),2) 59 if MB > 0: 60 result = str(MB) + "MB" 61 else: 62 result = str(float(number)) + "B" 63 return result 64 65 66 main()
这样就拿到一个数据量不太大的文件了,已经将C盘大于500M的文件夹列出了,但是没列出相关文件,需要相关文件信息的话可以用处理文件夹相同的方法,格式化一下字符串信息存放到文件信息列表里。
遇到的问题及解决方案:
因为好久没写逻辑代码了,所以遇到不少问题,好在都处理了,代价嘛,花了两天时间,
1、文件夹和文件的遍历逻辑,
开始就想到了用递归遍历一遍就得出所有数据,不用多次迭代,也试过创建新类来实现,试了两次,始终没找到好的处理文件夹那种多层反复迭代包含的遍历方法,最终还是用了计算哪个文件夹大小,就重新遍历其子文件夹和文件的方法,最后统计列表里有好多重复项,只得再写去重函数处理,
2、有一个难点就是在处理java中对double类型执行=+失败,
是用=+对当前遍历的子文件夹和文件的大小进行连加,但是计算过程中到最后一个连加时就会丢失之前的计算结果,只保留最后一次获取的文件大小数据。这个问题处理了好久,始终想不明白,最后觉得可能出问题的地方都用替代方案试了,最后试到A=+B改成A=B+A时,程序正常了,原因不明,不知道是因为数据太长还是堆栈太高导致的,
发现的问题:
1、猎豹浏览器的C盘文件中放了一个4G+的flash插件,简直不敢相信,但是还不敢删,已向官方发起提问,
2、Tencent,简直就是个流氓,在C盘的文件中存放了很多广告数据和图片,没猜错的话,他将针对用户的行为分析数据也放在了C盘;此外,WeiChat的桌面版还把所有聊天记录的图片、表情、文件、视频以及其他所有聊天数据全部放到了C盘,
3、N显卡问题。因为实验需要本来想配置N卡用来做GPU加速的,结果CUDA并没有配置成功,之后卸载了,之后重装了显卡驱动,结果C盘出现了好多这个显卡的数据文件,还不敢删,呵呵,
4、Win7补丁和更新问题。找到Windows下很多数据文件都很大,但是都出现在关键文件夹下,不知道是不是冗余文件,也不敢删除,Windows和N卡一样,每次更新会重新下载需要的程序,而且还保留原来的,安装完也不做统一删除,就在C盘里放着,真是够了,
怪不得很多人一年就重装系统,但是我系统涉及系统盘的软件太多了,安装麻烦,依赖调试更麻烦,轻易不想重装。这次重点对一些文件进行了转储,删除了部分文件,想调整虚拟内存的,但是一动系统主题就变回经典版,不知道怎么回事,
就这些了,明天或者今晚开始,需要做一些正事了,忙完这一阵——接着忙下一阵……
一个N/A显卡驱动残留瘦身攻略,不知道是否有用,