linux回收站设计
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回收站设计的更多相关文章
- 《linux内核设计与实现》实践之模块及深入
<linux内核设计与实现>实践之模块及深入 写在前面的话. 基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分.由于大家都 ...
- 《Linux内核设计与实现》CHAPTER13阅读梳理
<Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...
- 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...
- 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- Linux内核模块设计
内核的设计有两种方式:单内核和微内核,两者各有优劣,关于两者的比较可以参见wiki.windowds和Solaris采用微内核结构. Linux内核采用单内核结构,设计比较简单,但单内核的理念是把所有 ...
- 《Linux内核设计与实现》读书笔记 - 目录 (完结)
读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...
随机推荐
- java实现Haffman编码
1.先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下 package com.hjp.huffman; /** * Created by J ...
- C++ typedef用法小结 (※不能不看※)
C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...
- SCI答复审稿人的策略和答复信的写作技巧
SCI论文被录用的最后一步 –---答复审稿人的策略和答复信的写作技巧 [好文转载] : 一篇稿子从酝酿到成型历经艰辛,投出去之后又是漫长的等待,好容易收到编辑的回信,得到的往往又是审稿人不留情面的一 ...
- System.Diagnostics.Trace.Listeners
System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.AutoFlush = true; System.Diagno ...
- iwebshop二次开发
1.iwebshop中写hello world ① 动作action方式 controllers目录下,然后创建text.php. <?php class Test extends IContr ...
- javascript函数命名的三种方式及区别
1, function fn(val1,val2) { alert(val1+val2); } fn(1,2); 2, var fn=function() { alert(val1+val2); } ...
- linux 下tar 的用法
1)tar -r 可以append file to tared_package.tar -rf tared_package 添加文件2)不打包目录用ls -a --color=none | grep ...
- asp.net mvc ClaimsIdentity 授权研究 (还是测试版 有bug)
安装 Microsoft.Owin.Host.SystemWeb Identity.Core Microsoft.Owin.Security.Cookies 在是startup.cs做如下修改 p ...
- array_fill 用给定的值填充数组
转自:http://www.phpstudy.net/php/165.html PHP array_fill 用给定的值填充数组 array_fill (PHP 4 >= 4.2.0, PHP ...
- Linux下的一个图形管理工具webmin
这个工具其实我在两年前的小白时期还是经常用的,因为那时候对Linux比较陌生在为数server的时候帮了我很多工作,现在周末外面下雨,闲来无事莫名其妙的想起他来. 工具优点:最大特点是他是脚本安装 不 ...