999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux下本地文件快速搜索工具設(shè)計(jì)與實(shí)現(xiàn)

2018-03-28 06:03:14馮荷飛孫前
軟件工程 2018年2期

馮荷飛 孫前

摘 要:本地計(jì)算機(jī)內(nèi)文件數(shù)量逐年增長(zhǎng),并且文件和目錄還處于不斷的變化中,比如新增、刪除、修改等,因而用戶(hù)想要快速定位到所需文件也是越發(fā)困難。隨著Linux操作系統(tǒng)的推廣,普通Linux用戶(hù)更需要一款易用的本地文件快速搜索工具。在業(yè)務(wù)邏輯模塊中建立全盤(pán)索引、更新文件索引信息,采用Tkinter庫(kù)設(shè)計(jì)圖形用戶(hù)界面,以SQlite嵌入式數(shù)據(jù)庫(kù)管理索引數(shù)據(jù),并使用inotify接口調(diào)用Linux內(nèi)核特性來(lái)監(jiān)控文件系統(tǒng)的變化?;诖?,本文使用Python語(yǔ)言開(kāi)發(fā)了一款輕量級(jí)的本地文件搜索工具,并能夠方便普通Linux用戶(hù)的快速搜索需求。

關(guān)鍵詞:Linux;本地文件;搜索;快速

中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A

Abstract:Given that local files in computers increase year by year,and files and catalogues are in continuous changes,such as add,delete,modify,etc.,it becomes more difficult for users to fast locate the required documents.With the promotion of the Linux operating system,ordinary Linux users need an easy-to-use fast searching tool for local files.In the business logic module,the paper sets up index,updates file index information,uses Tkinter library to design GUI,manages data with SQlite embedded database,and applies Inotify interface to call Linux kernel characteristics to monitor file system changes.Based on this,this paper uses the Python language to develop a convenient local file searching tool,which can facilitate the rapid search requirements of ordinary Linux users.

Keywords:Linux;local files;search;fast

1 引言(Introduction)

在現(xiàn)今信息化時(shí)代,大數(shù)據(jù)概念已深入人心,各種類(lèi)型信息、資源層出不窮。個(gè)人計(jì)算機(jī)中的文件越來(lái)越多,用戶(hù)想要快速定位到所需文件也是越發(fā)困難。操作系統(tǒng)自帶的文件搜索工具搜索速度較慢。因而在Windows平臺(tái)下出現(xiàn)了一大批由第三方開(kāi)發(fā)的本地文件快速搜索工具,其中最著名的則是Everything軟件[1]。近年來(lái)隨著Linux操作系統(tǒng)的大力推廣,眾多國(guó)內(nèi)Linux發(fā)行版中的中標(biāo)麒麟、優(yōu)麒麟、Deepin日益成熟,不少普通用戶(hù)也選擇了Linux系統(tǒng)。而Linux系統(tǒng)下卻沒(méi)有簡(jiǎn)單易用的本地快速搜索工具。因此開(kāi)發(fā)一款滿(mǎn)足普通用戶(hù)的輕量級(jí)本地文件搜索工具顯得十分有必要。

2 Linux下的文件查找方法(The file locating method in Linux)

任何一種操作系統(tǒng)都由成千上萬(wàn)的文件組成,Linux系統(tǒng)更是認(rèn)為“一切皆文件”。普通的文件、目錄、字符設(shè)備、塊設(shè)備、套接字等在Linux中都是以文件被對(duì)待。雖然類(lèi)型不同,但是對(duì)其提供的卻是同一套操作接口。在Linux系統(tǒng)中準(zhǔn)確高效地確定一個(gè)文件在系統(tǒng)中的具體位置一般來(lái)說(shuō)有三種搜索方法,即使用文件管理器,使用find命令,使用locate命令。

2.1 文件管理器

文件管理器是Linux系統(tǒng)桌面版的必備工具,常見(jiàn)的有Nautilus、Dolphin、Nemo、Peony。它們都提供了方便的文件管理功能,包括瀏覽、復(fù)制、剪切、粘貼、刪除、搜索等。文件管理器是普通用戶(hù)最常用的文件搜索工具。但因其在搜索文件時(shí)需要掃描整個(gè)磁盤(pán)文件,因而搜索時(shí)間常常會(huì)很長(zhǎng)。

2.2 find命令

find命令根據(jù)文件的屬性進(jìn)行查找,如文件名、文件大小、所屬組、所有者、訪問(wèn)時(shí)間、修改時(shí)間等。基本語(yǔ)法如下:# find path expression search-term。例如使用find命令根據(jù)文件名來(lái)查找特定文件時(shí)可以用:# find\-name "test.file"。該命令會(huì)搜索整個(gè)目錄樹(shù)來(lái)查找名為test.file的文件,并且會(huì)提供其存放位置。find命令有時(shí)會(huì)花費(fèi)十幾分鐘來(lái)查找整個(gè)目錄樹(shù),特別是當(dāng)系統(tǒng)中有很多文件和目錄時(shí)搜索時(shí)間會(huì)更長(zhǎng)。

2.3 locate命令

locate是一種比f(wàn)ind速度更快的文件搜索方式。它事先構(gòu)建索引數(shù)據(jù)庫(kù),通過(guò)匹配文件信息進(jìn)而定位符合條件的文件。索引的構(gòu)建過(guò)程需要遍歷整個(gè)根文件系統(tǒng),較為耗費(fèi)資源,因此其常常在系統(tǒng)較為空閑時(shí)進(jìn)行。locate屬于非實(shí)時(shí)查找,使用locate搜索文件的語(yǔ)法為:# locate filename。例如,使用# locate TKinter命令可得到如圖1所示的搜索結(jié)果。

此外locate有很多選項(xiàng)來(lái)過(guò)濾輸出。如果要更新搜索數(shù)據(jù)庫(kù),可以運(yùn)行命令:# updatedb。就如同find命令一樣,locate查詢(xún)文件得到的也只是文件的地址。如果想要定位到被查詢(xún)文件,則還需另外的命令,比如:# nautilus [文件目錄](méi)。并且locate的文件索引數(shù)據(jù)庫(kù)不是實(shí)時(shí)更新的,對(duì)于一些新文件可能會(huì)搜索不到。

3 軟件結(jié)構(gòu)設(shè)計(jì)(Software structure design)

本文所述的軟件體量較小,總體結(jié)構(gòu)采用簡(jiǎn)化的MVC模式。軟件分為三個(gè)模塊,采用將業(yè)務(wù)邏輯、后臺(tái)數(shù)據(jù)與界面顯示分離的方式來(lái)組織代碼。使用模塊分離的方式有代碼耦合性低、重用性高的優(yōu)點(diǎn),并且當(dāng)軟件需求變更、算法改進(jìn)、界面美化時(shí)更易于維護(hù)和修改。

3.1 業(yè)務(wù)邏輯模塊

業(yè)務(wù)邏輯模塊(Module.py)用于處理應(yīng)用程序數(shù)據(jù)邏輯,它包含了一些函數(shù)和全局變量,其中主要函數(shù)見(jiàn)表1。這些函數(shù)實(shí)現(xiàn)了指定目錄下文件索引建立、創(chuàng)建數(shù)據(jù)庫(kù)、數(shù)據(jù)入庫(kù)、數(shù)據(jù)查詢(xún)以及文件索引實(shí)時(shí)更新等功能。

表1 業(yè)務(wù)邏輯模塊中的主要函數(shù)

Tab.1 The main function in the business logic module

函數(shù) 描述

def create_db(): #創(chuàng)建sqlite數(shù)據(jù)庫(kù),用于存儲(chǔ)文件索引信息

def index_all_files(dir_path): #遍歷dir_path磁盤(pán)目錄,并保存得到的文件索引信息

def insert_to_db(file_path,file_name): #插入文件索引記錄到sqlite數(shù)據(jù)庫(kù)

def InitDB(): #完成初始化工作,通過(guò)調(diào)用上述三個(gè)方法來(lái)建立數(shù)據(jù)庫(kù)、獲取文件索引、索引信息入庫(kù)

def find_file(file_name): #在數(shù)據(jù)庫(kù)中查找文件信息,主要工作是使用sql語(yǔ)句在數(shù)據(jù)庫(kù)中查詢(xún)

def updateDB(dir_path): #實(shí)時(shí)監(jiān)控dir_path目錄下的文件變化情況,如有變動(dòng)立即更新文件索引到數(shù)據(jù)庫(kù)中

3.2 后臺(tái)數(shù)據(jù)模塊

本文使用SQLite數(shù)據(jù)庫(kù)進(jìn)行后臺(tái)數(shù)據(jù)管理。SQLite是一個(gè)嵌入式開(kāi)源的關(guān)系數(shù)據(jù)庫(kù),其特點(diǎn)是自包容、零配置、無(wú)服務(wù)端和支持事務(wù)。在大多數(shù)情況下只要確保SQLite的二進(jìn)制文件存在即可創(chuàng)建、連接和使用數(shù)據(jù)庫(kù)。它能夠支持Windows/Linux/Unix等主流操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合,并且還有ODBC接口[2]。

可使用如下python腳本創(chuàng)建SQlite數(shù)據(jù)庫(kù)文件[3]:

sqlite_con=sqlite3.connect('fileIndex.db')

sqlite_cur=sqlite_con.cursor()

sqlite_cur.execute('CREATE TABLE FOO (o_id INTEGER PRIMARY KEY, file_path VARCHAR(260), file_name VARCHAR(260))')

sqlite_con.commit

創(chuàng)建SQlite數(shù)據(jù)文件后就可以正常使用SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)了??墒褂萌缦聀ython腳本語(yǔ)句:

sqlite_cur.execute('INSERT INTO FOO (o_id, file_path, file_name)VALUES(NULL,?,?)',[file_path.decode('utf-8'),file_name.decode('utf-8 ')])

將單個(gè)文件的索引信息作為一條記錄存入數(shù)據(jù)庫(kù)中。

3.3 界面顯模塊

Python作為一種腳本語(yǔ)言,開(kāi)發(fā)圖形用戶(hù)界面并不是它的強(qiáng)項(xiàng)。但開(kāi)發(fā)人員仍然有多種選擇,包括wxWidgets、PyQt、PyGTK和Tkinter等[4]。

(1)wxPython是Python語(yǔ)言的一套開(kāi)源GUI庫(kù),它是wxWidgets的Python封裝,以Python模塊的方式提供給用戶(hù)。同時(shí)wxPython具有非常優(yōu)秀的跨平臺(tái)能力,能夠運(yùn)行在Windows系統(tǒng)、絕大多數(shù)的Unix或類(lèi)Unix系統(tǒng)、Macintosh OS上。

(2)PyQt是Qt庫(kù)的Python版本。它實(shí)現(xiàn)了一個(gè)Python模塊集,有超過(guò)300個(gè)類(lèi),將近6000個(gè)函數(shù).它是一個(gè)多平臺(tái)的工具包,可以運(yùn)行在大部分操作系統(tǒng)上,包括UNIX、Windows和Mac。PyQt采用雙許可證,開(kāi)發(fā)人員可以選擇GPL或商業(yè)許可。

(3)Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù),是一個(gè)輕量級(jí)的跨平臺(tái)圖形用戶(hù)界面開(kāi)發(fā)工具。Tkinter是內(nèi)置庫(kù),由一定數(shù)量的模塊組成,與Python的結(jié)合度最好。Tkinter位于一個(gè)名為_(kāi)tkinter的二進(jìn)制模塊中。只要安裝好Python,就能通過(guò)import Tkinter導(dǎo)入并調(diào)用[5]。

Tkinter的不足之處是缺少可視化界面設(shè)計(jì)工具,需要通過(guò)代碼來(lái)完成窗口設(shè)計(jì)和元素布局。IDLE是開(kāi)發(fā)python程序的基本IDE(集成開(kāi)發(fā)環(huán)境),而IDLE本身也是用Tkinter編寫(xiě)而成??梢?jiàn)對(duì)于簡(jiǎn)單的圖形界面,Tkinter還是能應(yīng)付自如,因而使用TKinter作為本文程序界面也是最合適的。

4 數(shù)據(jù)實(shí)時(shí)更新(Real-time data update)

inotify是一個(gè)Linux的內(nèi)核特性,提供了一種監(jiān)控文件系統(tǒng)事件的機(jī)制。它可以監(jiān)控文件系統(tǒng)的變化,如文件修改、新增、刪除等,并能將相應(yīng)的事件通知給應(yīng)用程序[6]。此功能從kernel 2.6.13開(kāi)始正式并入內(nèi)核,可以使用“l(fā)l /proc/sys/fs/inotify命令”來(lái)檢查內(nèi)核是否加入了inotify的支持[7]。

4.1 安裝inotify-tools

要想方便地使用inotify,還需要安裝inotify-tools來(lái)控制內(nèi)核的這種功能。inotify-tools是一套組件,它包括一個(gè)C庫(kù)和幾個(gè)命令行工具,這些命令行工具可用于通過(guò)命令行或腳本對(duì)某文件系統(tǒng)的事件進(jìn)行監(jiān)控。inotify-tools的安裝腳本如下:

wget http://github.com/downloads/rvoicilas/inotify

-tools/inotify-tools-3.14.tar.gz

tar xzf inotify-tools-3.14.tar.gz ;

cd inotify-tools-3.14

./configure --prefix=/usr && make && su -c 'make install'

4.2 實(shí)時(shí)監(jiān)控和更新文件索引

inotifywait是inotify-tools中的一個(gè)命令,用于等待文件或者文件集上的一個(gè)特定事件。它可以監(jiān)控任何文件或者目錄,并且可以遞歸地監(jiān)控整個(gè)目錄樹(shù)。inotifywait命令的基本語(yǔ)法為:

inotifywait [-hcmrq] [-e] [-t] [--format] [--timefmt] [ ... ]。

其中的部分參數(shù)說(shuō)明:

-m:一直監(jiān)視指定目錄,如果沒(méi)有這個(gè)選項(xiàng)則接收到一個(gè)事件后就退出。

-r:遞歸監(jiān)視指定目錄,即包括所有子目錄。

-q:輸出少量事件信息,無(wú)附加開(kāi)頭的說(shuō)明信息。

應(yīng)用程序在使用inotifywait命令得到監(jiān)控目錄變化事件后,保存變化的信息,并更新數(shù)據(jù)庫(kù)中的信息。主要腳本如下:

#!/bin/sh

src=/home/sundoo/文檔/xz #要監(jiān)控的目錄

/usr/local/bin/inotifywait -rmq --format '%e %w %f' -e modify,delete,create $src | while read eventName dirName fileName;

do

echo "-- 事件:$eventName 文件:$fileName 目錄:$dirName" >> Log.txt

/bin/bash update.sh #更新數(shù)據(jù)庫(kù)

done

5 開(kāi)發(fā)案例及運(yùn)行效果(Development case and operation effect)

本文選用Phthon語(yǔ)言作為開(kāi)發(fā)工具。各個(gè)Linux發(fā)行版通常都會(huì)自帶Python,選用Python開(kāi)發(fā)免去了安裝配置,甚至直接使用文本編輯工具即能完成編碼。本文實(shí)際環(huán)境:操作系統(tǒng)為Ubuntu Kylin17.10,開(kāi)發(fā)工具為Eclipse+PyDev插件。硬件為i5-4200M CPU,ddr3 1600 6GB內(nèi)存,固態(tài)加機(jī)械硬盤(pán)。軟件運(yùn)行效果如圖2所示。

作為一個(gè)輕量級(jí)的本地文件即時(shí)搜索工具,核心指標(biāo)是滿(mǎn)足Linux下普通用戶(hù)的快速搜索需求。采用本文開(kāi)發(fā)的軟件搜索速度極快,用戶(hù)體驗(yàn)上能夠達(dá)到回車(chē)即見(jiàn)結(jié)果。同時(shí)軟件支持模糊查詢(xún),只要記得部分文件名即可。得到搜索結(jié)果列表后只需要雙擊即可定位打開(kāi)所需文件,并且實(shí)現(xiàn)了文件索引的實(shí)時(shí)更新。

6 結(jié)論(Conclusion)

實(shí)測(cè)中建立/home、/media兩塊硬盤(pán)索引,共生成874503條記錄,用時(shí)879秒,耗時(shí)較長(zhǎng)。下一步可以采用多線(xiàn)程技術(shù)、優(yōu)化SQL命令和文件索引算法來(lái)減少建立全盤(pán)索引時(shí)間,以及通過(guò)美化界面,提高搜索的智能化,來(lái)進(jìn)一步方便普通Linux用戶(hù)使用。

參考文獻(xiàn)(References)

[1] 劉艷,楊奇龍,蔡燕冬.FileFinder:桌面搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(7):2627-2631.

[2] 陳華政,陳劍.基于SQLite的中文全檢索研究與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2013,12(7):138-140.

[3] 戴昱,黃德才.SQLite的SQL語(yǔ)句高速緩存技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(1):183-185.

[4] 韓宏峰,馮石,羅羿隆.基于Java與Python的面向?qū)ο缶幊痰幕咎卣餮芯縖J].軟件工程,2017,20(8):1-3.

[5] 嵩天,禮欣,黃天羽.python語(yǔ)言程序設(shè)計(jì)基礎(chǔ)[M].北京:高等教育出版社,2017:6-13.

[6] 楊凱飛,李文波,柯川.面向桌面環(huán)境的索引實(shí)時(shí)更新方法[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(10):20-28.

[7] Chun W J.宋吉廣,譯.Python核心編程(第2版)[M].北京:人民郵電出版社,2008:1-23.

作者簡(jiǎn)介:

馮荷飛(1983-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)軟件理論,人工智能.

孫 前(1984-),男,碩士,工程師.研究領(lǐng)域:作戰(zhàn)仿真,數(shù)據(jù)分析.

主站蜘蛛池模板: 99在线视频免费观看| 久久综合色天堂av| 日韩毛片在线播放| 亚洲精品国产首次亮相| 91在线国内在线播放老师| 一级毛片在线免费视频| 免费欧美一级| 亚洲天堂区| 日韩美毛片| 怡春院欧美一区二区三区免费| 亚洲欧洲日产国产无码AV| 亚洲国产无码有码| 欧美成人a∨视频免费观看| 免费不卡在线观看av| 免费视频在线2021入口| 综合色区亚洲熟妇在线| 国产你懂得| 91在线高清视频| 亚洲第一福利视频导航| 日韩a级毛片| 亚洲免费毛片| 5388国产亚洲欧美在线观看| 真人免费一级毛片一区二区| 欧美激情福利| 色窝窝免费一区二区三区| 熟女视频91| 日韩毛片基地| 青青草一区二区免费精品| 中文字幕久久波多野结衣| 九月婷婷亚洲综合在线| 伊人国产无码高清视频| 精品国产成人a在线观看| 国产精品.com| 国产在线精彩视频二区| 国产91无码福利在线 | 国产中文一区a级毛片视频| 成年网址网站在线观看| 激情综合激情| 在线色国产| h网站在线播放| 欧美日韩午夜视频在线观看| 中文字幕在线欧美| 毛片在线播放网址| 国产精品尤物铁牛tv | 欧美不卡视频在线| 国产男女XX00免费观看| 亚洲精品国产成人7777| 自拍偷拍欧美日韩| 国产女人爽到高潮的免费视频| 91娇喘视频| 狠狠色丁香婷婷综合| 欧美精品在线看| 亚洲成人精品在线| 久久99国产精品成人欧美| 国产欧美日韩精品第二区| 国产99视频免费精品是看6| 国产微拍一区| 国产精品一区不卡| 成人一级黄色毛片| 999在线免费视频| 2020极品精品国产| 婷婷在线网站| 久久综合激情网| 国产精品手机视频| 亚洲日本一本dvd高清| 人与鲁专区| 亚洲狼网站狼狼鲁亚洲下载| 99re视频在线| 国产97视频在线| 一级毛片在线播放免费| 四虎在线观看视频高清无码| 亚洲色图综合在线| 亚洲综合久久一本伊一区| 人妻无码一区二区视频| 国产成人无码久久久久毛片| 日韩毛片免费| 九九视频免费在线观看| 无码一区中文字幕| 在线免费观看AV| 亚洲日韩图片专区第1页| 激情综合网址| 国产女人水多毛片18|