国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

2018-03-28 06:03馮荷飛孫前
軟件工程 2018年2期
關(guān)鍵詞:快速搜索

馮荷飛 孫前

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

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

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

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

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

2.1 文件管理器

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

2.2 find命令

find命令根據(jù)文件的屬性進行查找,如文件名、文件大小、所屬組、所有者、訪問時間、修改時間等?;菊Z法如下:# find path expression search-term。例如使用find命令根據(jù)文件名來查找特定文件時可以用:# find\-name "test.file"。該命令會搜索整個目錄樹來查找名為test.file的文件,并且會提供其存放位置。find命令有時會花費十幾分鐘來查找整個目錄樹,特別是當系統(tǒng)中有很多文件和目錄時搜索時間會更長。

2.3 locate命令

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

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

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

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

3.1 業(yè)務邏輯模塊

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

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

Tab.1 The main function in the business logic module

函數(shù) 描述

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

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

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

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

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

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

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

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

可使用如下python腳本創(chuàng)建SQlite數(shù)據(jù)庫文件[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語句來操作數(shù)據(jù)庫了??墒褂萌缦聀ython腳本語句:

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

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

3.3 界面顯模塊

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

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

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

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

Tkinter的不足之處是缺少可視化界面設計工具,需要通過代碼來完成窗口設計和元素布局。IDLE是開發(fā)python程序的基本IDE(集成開發(fā)環(huán)境),而IDLE本身也是用Tkinter編寫而成??梢妼τ诤唵蔚膱D形界面,Tkinter還是能應付自如,因而使用TKinter作為本文程序界面也是最合適的。

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

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

4.1 安裝inotify-tools

要想方便地使用inotify,還需要安裝inotify-tools來控制內(nèi)核的這種功能。inotify-tools是一套組件,它包括一個C庫和幾個命令行工具,這些命令行工具可用于通過命令行或腳本對某文件系統(tǒng)的事件進行監(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 實時監(jiān)控和更新文件索引

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

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

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

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

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

-q:輸出少量事件信息,無附加開頭的說明信息。

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

#!/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ù)庫

done

5 開發(fā)案例及運行效果(Development case and operation effect)

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

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

6 結(jié)論(Conclusion)

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

參考文獻(References)

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

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

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

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

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

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

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

作者簡介:

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

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

猜你喜歡
快速搜索
優(yōu)惠信息檢索與分析
德格县| 湖北省| 承德市| 扎鲁特旗| 南靖县| 白玉县| 阿坝县| 大理市| 龙南县| 吉木萨尔县| 佳木斯市| 陇南市| 宜兴市| 都江堰市| 余江县| 自治县| 佳木斯市| 夏津县| 舞钢市| 东台市| 济宁市| 高唐县| 运城市| 兰州市| 清远市| 苍南县| 旅游| 内黄县| 怀仁县| 乌拉特后旗| 锡林郭勒盟| 望谟县| 青田县| 若羌县| 雷州市| 甘谷县| 漳州市| 三亚市| 清涧县| 永昌县| 万宁市|