日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux操作系統(tǒng)下的離線瀏覽器介紹

本文將介紹如何實(shí)現(xiàn)一個(gè)離線瀏覽器,以下載并瀏覽網(wǎng)上資源 。
鏡像目錄結(jié)構(gòu)
離線瀏覽下載到本地的網(wǎng)頁(yè)時(shí),需要解決的一個(gè)關(guān)鍵性問(wèn)題就是“如何通過(guò)某一網(wǎng)頁(yè)中的超級(jí)鏈接正確地定位其他網(wǎng)頁(yè)” 。比較簡(jiǎn)便的方法是在用戶指定的本地目錄下建立一個(gè)目標(biāo)網(wǎng)站的完整或部分鏡像 。也就是按照文件在服務(wù)器端的目錄結(jié)構(gòu)保存下載的文件(參見(jiàn)下圖) 。這樣一來(lái),如果網(wǎng)頁(yè)中的超級(jí)鏈接是以相對(duì)路徑形式給出的,那么瀏覽程序就可以直接通過(guò)此相對(duì)路徑訪問(wèn)到本地文件系統(tǒng)中的網(wǎng)頁(yè);如果網(wǎng)頁(yè)中的超級(jí)鏈接是以絕對(duì)的URL形式給出的,那么必須在保存網(wǎng)頁(yè)之前將這些URL轉(zhuǎn)換為本地絕對(duì)路徑 。
在網(wǎng)絡(luò)中,一個(gè)有效的URL應(yīng)該只有唯一的網(wǎng)絡(luò)文件與之對(duì)應(yīng) 。因此,只要將網(wǎng)絡(luò)上由URL所確定的層次關(guān)系,轉(zhuǎn)化為本地文件系統(tǒng)中由目錄路徑所確定的層次關(guān)系,就可以建立網(wǎng)站在本地的完全或部分鏡像 。下面討論建立鏡像的具體方法 。
鏡像路徑算法
首先,將下載網(wǎng)頁(yè)時(shí)生成的URL拆分成協(xié)議類名(protocol)、IP地址(ipaddr)、目錄名(directory)和文件名(file) 。
KDE環(huán)境提供了一個(gè)用于解析URL的類KURL,只需要定義一個(gè)對(duì)象KURL u((const char*)URL),就可以利用該類提供的成員函數(shù)將URL拆解為所需的部分 。但是,此類未提供對(duì)ASP定位語(yǔ)句的支持,所以讀者可以在KURL的基礎(chǔ)上編寫自己的拆解函數(shù),以完善程序功能 。
需要注意的是,在同一網(wǎng)絡(luò)文件的URL中,網(wǎng)址部分可能是以域名地址形式給出的,也可能是以IP 地址形式給出的 。為了避免將同一文件鏡像到不同目錄下,如果網(wǎng)址是域名形式的,應(yīng)該使用socket函數(shù)gethostbyname ()將其轉(zhuǎn)換為IP地址 。
其次,確定網(wǎng)絡(luò)文件在本地的鏡像路徑 。假設(shè)用戶指定的本地目錄存放在字符數(shù)組LDir中,則代碼如下:
QString LocalDir = LDir“/”protocol“_”ipaddrdirectory
QString LocalPath = LocalDirfile;
這樣一來(lái),如果一個(gè)網(wǎng)絡(luò)文件的URL是http://11.171.38.32/webfile/relax/index.html,而用戶指定的本地目錄是/home/yangjx/web,則此網(wǎng)頁(yè)文件對(duì)應(yīng)的鏡像路徑為/home/yangjx/web/http_11.171.38.32/webfile/relax/index.html 。
處理下載文件
有了鏡像路徑生成算法,接下來(lái)要對(duì)下載的文件做如下處理:
● 如果是網(wǎng)頁(yè)文件,必須掃描文件,并將其中以絕對(duì)URL形式給出的超級(jí)鏈接替換成用鏡像路徑生成算法產(chǎn)生的本地絕對(duì)路徑,而那些以相對(duì)路徑形式給出的超級(jí)鏈接則保持不變;
● 建立相應(yīng)的目錄,并保存文件到絕對(duì)路徑所指定的位置 。
在建立目錄時(shí),由于Linux提供的目錄創(chuàng)建函數(shù)int mkdir(char * dir, int mode)只能在已存在的目錄下建立一級(jí)子目錄,所以要用“遞歸”方式構(gòu)造一個(gè)目錄創(chuàng)建函數(shù):
static int CDirTools:: Mkdir(QString dir,int mode);
{;
QString parentdir
 if(dir.isEmpty());
//如果dir為空串返回失敗;
return -1
 int result = mkdir(dir,mode)
 if(result == -1 && errno == EEXIST) //如果dir目錄已經(jīng)存在,則返回1;
return 1
 if(result != -1);
//如果建立成功,則返回0;
return 0
 else;
 {//否則先創(chuàng)建其父目錄;
KURL u((const char *)dir)
//取得dir的父目錄;
parentdir = url.directory(false)
if(Mkdir(parentdir) == -1);
//如果父目錄創(chuàng)建失敗,則返回-1;否則再次創(chuàng)建本目錄;
 return -1
if(mkdir(dir,mode) == -1);
//如果本目錄創(chuàng)建失敗,則返回-1;
return -1
 };
}
編程實(shí)現(xiàn)
Linux操作系統(tǒng)的桌面環(huán)境KDE提供了一個(gè)文件管理器KFM,它和IE一樣既可以瀏覽本地目錄和文件,也可以瀏覽網(wǎng)頁(yè),并且KFM還提供了C編程接口: KHTMLView類 。我們可以創(chuàng)建一個(gè)KHTMLView類的子類CHtmlView來(lái)瀏覽下載的網(wǎng)頁(yè)文件 。

推薦閱讀