相信很多人跟我一樣很懷念前幾年網盤百家爭鳴的盛況,然而一些不可描述的原因導致了這些網盤的悲劇命運。這其中有我最喜歡的金山快盤。金山快盤和其他捆綁一個厚重且不時會彈出廣告的客戶端的網盤不同,金山快盤對映一個目錄到伺服器並保持實時同步。我不需要帶著電腦跑來跑去,白天沒有寫完的文件,ppt臨下班時可以扔進目錄,回家用家裡的電腦開啟目錄就能發現它們已經躺在裡面。看到有趣的影片,好聽的音樂,下載下來扔到目錄,次日白天跟同事們分享。

然而這一切似乎都被一紙檔案終結了,一如網際網路彩票的命運。不能買彩票的日子,寂寞如雪。縱觀當前還在提供服務的網盤,大多沒有辦法做到金山快盤那樣把目錄跟伺服器保持自動實時同步又甘願做一個默默無聞的幕後英雄。它們中要麼捆綁一個厚重的看似功能完備卻都是癢點需求的客戶端,彈窗,跳到瀏覽器等還要時不時出來找找存在感。要麼就是功能太弱智,連同步都做不到,整個一下載頁面的客戶端版,更遑論同步盤了。當然對於我,對於這個專欄系列來說它們都有一個重要而致命的問題——不支援Linux。

於是,作為被拋棄的孩子,我們堅決擁護並響應“自己動手,豐衣足食”的口號。

使用Ruby實現七牛同步盤(一)

使用Ruby實現七牛同步盤(一)

(注:圖文無關 O(∩_∩)O~ )

首先,註冊七牛個人開發者,可以擁有10G免費容量,足夠我們日常使用了。

接著我們來說說ruby。

我知道知乎是Python大本營,而Ruby在知乎群體不到py群體十分之一。但從個人情感角度講我更喜歡Ruby,待會我會列舉幾個例子來說明我為什麼更喜歡Ruby。當然我並不是想把Ruby和Python放到對立面。驕傲地說我自己也算半個Python高手了吧?Python一直以來被奉為運維神器(當然並不是說它只能用來做運維工具),是因為py既有shell這種所見即所得的指令碼能力,又能跟作業系統本身結合緊密比如os模組、fcntl模組和sys模組,同時面向物件,可以輕鬆構建出shellscript很難達到的軟體規模。Ruby相對於Python,物件化的更徹底,同時在別的語言中物件中對程式設計師隱藏的屬性和方法,Ruby全部對程式設計師開放了(感覺),這讓Ruby擁有了幾乎無敵的超程式設計能力。如果不涉及到跟別人合作,你可以按照自己的喜好程式設計,充分發揮自己的創意,這本來就是程式設計的魅力,不是嗎?:)如果你已經會了Python,那麼學習了Ruby將開啟你的眼界,給你另一個看待問題的視角,這些又可以反過來作用你的Python技能,促使你寫出更好的程式碼。

安裝Ruby推薦使用RVM工具,依賴管理使用bundle,安裝這些工具不是本文的重點。利用百度谷歌和一點點英文閱讀能力,可以很輕鬆的搞定。在此我選擇ruby2。4來作為這次行文記錄的版本。按理說ruby是跨平臺的,本系列文章所做同步盤理論上可以奔跑在任何作業系統上面(包括mac,windows)。但是一如我專欄開頭所說,我的所有文章都是基於Archlinux+lxde的基礎上構建的,本人不為程式碼正常工作在ubuntu,opensuse甚至mac,windows上負責!

按照慣例,先不急於寫程式碼,而是規劃流程以及技術重難點。關於流程我的思路是這樣的,拿到七牛服務端的檔案列表A比對本地目錄中的檔案列表B,A中存在而B中不存在的檔案我們需要下載,B中存在的檔案而A中不存在的檔案,我們需要上傳。還有一個問題就是刪除檔案。如果我們主動刪除了檔案,這樣按照我們之前規劃程式又會從伺服器下載一遍檔案。所以我們需要一個目錄監聽的功能。增刪改本地目錄牽扯到上傳,比對牽扯到下載,於是重新規劃就很清晰了。

1。 比對A、B。 A中存在而B不存在的就下載

2。 監聽增刪改事件,用來觸發上傳

七牛方面的東西我們先放一放,因為有官方sdk以及文件。所以在七牛方面我們應該不會遇到什麼問題。

開啟terminal,輸入irb進入ruby shell。我們來體會一下ruby不輸python的系統管理模組。

>

require

‘fileutils’

#匯入fileutils模組

=>

true

>

include

FileUtils

#載入FileUtils函式到Object物件上來

=>

Object

>

cd

‘/home/rowland/test’

>

pwd

=>

‘/home/rowland/test’

>

touch

‘ok。txt’

=>

‘ok。txt’

>

mv

‘ok。txt’

‘111。txt’

=>

0

>

rm

‘111。txt’

ruby的函式呼叫可以省略“()”,在引數單一,且沒有xx。x()。x()這種連續呼叫的時候建議省略。

cd函式是屬於FileUtils的,省略類名呼叫cd預設呼叫Object。cd函式,由於剛剛我們已經把FileUtils的所有函式載入到了Object上面,所以Object也擁有了FileUtils的函式,這樣我們才能直接cd ‘xxx’,是不是很神奇?

相信出於職業病,你會ls一下然後沮喪,並沒有ls列舉目錄的功能。是的,並沒有。但是仔細想一想,我們這個同步盤的列舉目錄和ls實現的列舉目錄還是不太一樣的,我們需要的是遞迴列舉所有子目錄。有沒有辦法呢?有的,標準庫模組Find就具備這個功能。

>

require

‘find’

=>

true

>

Find

find

‘/home/rowland/test’

entries

=>

“。”

“。/111。txt”

“。/aaa”

“。/ccd”

“。/xx/dd/cc”

“。/無標題文件”

好了,列舉本地目錄功能和本地檔案操作的重難點我們已經攻克。還剩一個重難點,監視目錄!這裡就需要安裝一個額外的第三方庫了——“listen”模組。首先在程式碼目錄下新建檔案Gemfile內容如下

source “https

//

gems

ruby

-

china

org

/”

gem

‘listen’

‘>=2。0’

第一行是申明下載源,因為一些眾所周知的原因,國內無法順利訪問到gem官方源,好在rubychina有映象源,下面一行申明listen庫和需要的版本。然後在terminal中使用

$> bundle install

安裝依賴。安裝失敗注意檢視日誌,有可能是許可權問題,也有可能是別的原因。總之日誌裡面應該會把錯誤語句顯示出來,你拿出來單獨執行應該就能看到詳細的報錯資訊。

進入irb。

>

require

‘listen’

>

listener

=

Listen

to

‘/home/rowland/test’

do

|

m

a

r

|

p

“modified :

#{

m

}

p

“added:

#{

a

}

p

“removed:

#{

r

}

end

>

listener

start

然後再去目錄裡面嘗試一下增刪改檔案(資料夾不會被捕獲),然後應該可以看到輸出

irb(main):008:0> “modified :[\”/home/rowland/test/cc/無標題文件\“]”

“added: []”

“removed: []”

“modified :[]”

“added: []”

“removed: [\”/home/rowland/test/cc/無標題文件\“]”

OK,事已至此,重難點都被我們攻克了,這個同步盤搞出來就是時間問題了。等下一次更新吧。

是不是很強勢?聽聽歌吧

使用Ruby實現七牛同步盤(一)

使用Ruby實現七牛同步盤(一)