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. css让图片作为按钮的背景并且大小合适

    最近在做ASP大作业,在做html页面的时候想把一个图片作为按钮的背景,搞了好久终于在csdn上找到了满意的答案: background-size: cover; 只需要这一句就ok了,就是这么简答. ...

  2. Java——URL和URLConnection

    使用URL读取内容 import java.awt.im.InputContext; import java.io.InputStream; import java.net.MalformedURLE ...

  3. 入门:HTML表单与Java 后台交互(复选框提交)

    仅仅给出部分关键代码: HTML form code: <form action="JavaFormTest" method="post" name=&q ...

  4. JMeter 安装与使用基本教程

    JMeter使用了不同技术和协议,是一款可以进行配置和执行负载测试.性能测试和压力测试的工具. 什么是JMeter? JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100% ...

  5. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...

  6. JavaScript基础整理(1)

    最近读了<JavaScript权威指南>这本书,闲来无事对自认为重要的知识做了些整理,方便以后查阅. JavaScript中的最重要的类型就是对象,对象是名/值对的集合,或字符串到值映射的 ...

  7. 使用cachemanager做缓存(Session的缓存)

    1.我在这里直接用 cachemanager.redis 往redis里面存储缓存数据2.步骤 1)下载CacheManager.Redis(包含了CacheManager.Core) 下载Stack ...

  8. 性能:15个JavaScript本地存储技术的函数库和工具

    当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...

  9. JS URL传递中文参数时出现乱码的处理

    在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想 ...

  10. WPF中的数据绑定!!!

    引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx  数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Pap ...