linux回收站设计

在windows下有一个很好的东西,那就是回收站,虽然有很多人批评它。linux不是没有回收站,很多桌面环境都可以看到是有回收站的。
这里是讨论如何设计一个回收站,而不是有没有的问题。最好的结果是将rm命令使用mv命令替代使用了。

1、设计思路

因为在linux下rm命令执行成功就直接将文件删除了,而不是将其移入回收站了,也没用给一个用于确认的命令提示,所以rm的误操作是很危险的。而使用mv命令来提供一个后悔机制,就挺好了。
我们可以设计这么一种操作,将rm命令用mv命令来改写,将要删除的文件,移动到一个隐藏的目录中。windows上的回收站就是这么做的,这是通常的做法。但是这还有一些问题,如下几点

1.文件同名问题。在一个目录下,不允许出现同名文件或者文件夹的问题。
2.恢复删除文件问题。如果只是简单的将要删除的文件移动到隐藏目录,那么就丢失了它原本所处的位置(路径)信息,不利于恢复到原目录。
3.不同分区问题。linux不同于windows,linux的目录结构并不体现出磁盘分区,所以单纯的根据文件路径不能确定其所在的分区。而如果不针对每个分区分设回收站,那么效率是很低的,因为不同分区间的文件移动,是会有拷贝过程的,而不仅仅只是目录项的操作。

2、设计思路问题分析

1、文件同名问题

文件同名的问题可以采取给文件编号的方式来解决。可以按照删除的顺序,给文件名加上一个数字前缀,这个数字从0开始,一直向上增加,就不会出现重复问题。对于这个数字,可以采取非十进制的设计来使得文件名更短小。比如说采取64进制的方式,以[0-9A-Za-z-_]这64个可见的可用于作为文件名的字符来作为前缀的"字符集",如果是64进制的话,那么需要的前缀长度可以选择固定长度,且不会很长。因为64=2^6,而2^32次方就已经大到42亿了,所以这里采用7或者8位就差不多足够了。对于整个文件夹删除的,仅仅对文件夹名加前缀就可以了。为了提高效率,还可以采取在前缀编号出现了空洞的时候(先删除了100个文件,又恢复了中间的20个,就出现了20个空洞的编号),采取不填补的原则,直接往后递增。当编号递增到最大值的时候,可以采取类似于磁盘整理的方式来进行前缀整理。

这里举一个例子,假设这里采取7位固定前缀。

删除的文件(夹)名 移动到回收站后的文件名
a.txt 0000000a.txt
b.jpg 0000001b.jpg
...删除了多个文件后 ...
tree.c 000001btree.c
dir 0000001cdir

这样做后,恢复文件的时候,只要去掉其前缀就可以了。采用固定长度前缀是为了提高效率,这里有一个问题没有解决,就是文件名长度的问题。因为绝大多数的文件名长度都远远低于限制大小,所有这个问题影响不大。


2、恢复删除文件问题

这个问题也很好解决,配合上一个问题的思路来做。因为前面说了给每一个删除的文件都加上了固定不重复的前缀,而文件名不可能为空,所以我们可以采取添加一个文件来纪录原文件所在路径的方式来解决这个问题。
举个栗子:有一个文件在目录/home/xxx/code/c/test/下,文件名是a.c。删除到回收站后,编号为000000km。那么这个文件删除到回收站后,将其文件名改为000000kma.c,那么再建立一个文件000000km这个文件的内容就是/home/xxx/code/c/test。这么做就保存了文件所在的原本路径,恢复的时候根据这个路径来恢复就是了。
---

3、不同分区问题

这个问题要解决也不难,就是针对各个分区设立回收站嘛。主要问题在于获取文件或者文件夹所在的分区。这个不难,可以通过df -h来获取各个分区的挂载点,然后对文件或目录的路径来比对得出其所在的分区即可。这里的一个问题是要不要为了提高效率而存储各个分区挂载路径的结果呢?我觉得是不需要的,使用df -h命令的成本并不高,而且不会涉及到分区卸载后再挂载到另外目录的情况。

linux回收站设计的更多相关文章

  1. 《linux内核设计与实现》实践之模块及深入

     <linux内核设计与实现>实践之模块及深入 写在前面的话. 基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分.由于大家都 ...

  2. 《Linux内核设计与实现》CHAPTER13阅读梳理

    <Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...

  3. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  4. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  5. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  6. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

  7. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  8. Linux内核模块设计

    内核的设计有两种方式:单内核和微内核,两者各有优劣,关于两者的比较可以参见wiki.windowds和Solaris采用微内核结构. Linux内核采用单内核结构,设计比较简单,但单内核的理念是把所有 ...

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

随机推荐

  1. oracle表字段为汉字,依据拼音排序

    在order by后面使用NLSSORT函数转化汉字列,如下 select * from student order by NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN ...

  2. UITextView限制输入文字

    一.设置UITextView的delegate为控制器 二.实现代理方法 #pragma mark - UITextViewDelegate - (BOOL)textView:(UITextView ...

  3. Multiple sequence alignment Benchmark Data set

    Multiple sequence alignment Benchmark Data set 1. 汇总: 序列比对标准数据集: http://www.drive5.com/bench/ This i ...

  4. OC-改错题

    1,类方法中不能访问成员变量 2,id后不能加*(因为id相当于NSObject *) 3,id类型的变量不能用点语法 4,类对象只能调用类方法,不能调用对象方法 .description #impo ...

  5. 使用idea开发Springmvc

    使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 http://my.oschina.net/gaussik/blog/385697?fromerr=A4EKE0Ix idea1 ...

  6. aop实现日志(转)

    文章来至于http://www.thinksaas.cn/group/topic/341436/ 第一:>>在spring的配置文件里增加以下配置 <!-- 支持 @AspectJ ...

  7. IOS开发中@2x图片等适应不同分辨率手机

    开发中,例如: nanshanImage.image=[UIImage imageNamed:@'index_pic.png']; 在项目中还保存中index_pic@2x.png的图片,此图为了只适 ...

  8. 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

    1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...

  9. ubuntu系统下更新jdk版本

    1. 添加软件源 sudo add-apt-repository ppa:webupd8team/java 2. 更新软件源 sudo apt-get update 3. 安装 jdk1.8 sudo ...

  10. 解析posix与perl标准的正则表达式区别 ---PHP

        正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系 ...