文件监控
我实现的文件监控主要是对某个文件夹里所有的文件检测是否修改、是否有新建文件、是否有文件被删除,并把这些改变记录到文件中。开始想用链表存储文件信息,毕竟链表删除方便,但链表的查找效率不高,所以打算用红黑树实现,因为红黑树查找和删除的操作都是比较快的。
基本思路是这样的:对于指定的文件夹,首先调用一个扫描函数,扫描指定文件夹里的所有文件和文件夹,当遇到一个文件或文件夹时,用文件名作为关键字在红黑树中查找该文件,如果不存在,就把文件名作为关键字,将文件路径,文件修改时间,标记等信息存入一个结点插入到红黑树中,将标记设置为新插入,如果存在,由于找到的结点会有多个(同名文件),所以要比较所有找到结点中保存的文件路径和当前文件路径,如果没有路径相同的,则将该文件做为新结点插入,否则比较找到的结点中文件修改的时间和当前文件修改时间是否相同,如果不同,这将标记设置为修改,如果相同,则将标记设置为未改变。然后调用一个检测函数,按中序遍历访问该树中的所有结点,检测结点标记,如果文件被修改了就将文件路径和文件修改时间记录到文件中。如果被删除了,则从树中将该结点删除,并把路径名和当前时间记录到文件中。如果文件是新插入的(除了第一次),也是把文件路径和时间记录到文件中。如果文件未改变,则标记文件为删除。然后是循环调用扫描函数和检测函数,由于没法像信号那样,一个文件被修改或删除后可以接收到什么信号,所以只有用这个笨方法了,开始我直接循环调用扫描函数和检测函数,发现运行后电脑很卡,然后我每调用一次这两个函数,就停个1s,发现不那么卡了,看来还是效率不高啊!!
编这个程序开始运行总是出现段错误,空指针什么的,用gdb调试了半天,还是没发现问题,后来我就扫描一个文件数为8个的文件夹,然后再一步一步的调试,终于发现了问题的所在,就是删除结点出了问题,因为我是把删除结点的指针传给红黑树的删除函数,但是我实现的红黑树函数真正删除的结点有可能是删除结点的后继结点,而我还是在删除函数返回后释放我传给红黑树的那个结点的空间,其实这个结点很有可能是我下一个要访问的结点,而我把它删除了,所以释放结点之前要判定删除的到底是哪个结点。开始我扫描了一个文件数很多的文件夹,也出现了这个错误,不过由于文件数实在是太多了,真的很难调试,结果只有傻傻的去看代码,打印中间结果什么的,调了半天还是没调出什么来,后来突然想到扫描个小文件夹不就行了啊!这才终于找到问题的所在啊!!
通过这个小程序,发现自己还有很多的不足,至少逻辑方面,考虑问题方面,调试方面还是存在不少问题的。以后要加强了!!!还有就是这次调试,打印语句我用了一个在网上找到的方法,貌似挺好用的:
1 #define DEFINEDEBUG /*注释掉就没有输出了*/ 2 #ifdef DEFINEDEBUG 3 #define PRINTDEBUG(fmt, arg...) fprintf(stderr, fmt, ##arg) 4 #else 5 #define PRINTDEBUG(fmt, arg...) 6 #endif
上面的arg...其实就是代表不确定参数,这个gcc支持,就不知道其它编译器能不能支持了。
附:文件扫描代码