贊助商連結

八月 02, 2006

監看檔案的異動

| 原始連結

軟體的功能越來越強大也越來越方便,於是不知不覺中一些很神奇的事就會被視為理所當然,但是只要仔細的找一找你就會發現其實有很多的不可思異之處,假如你的電腦是安裝Windows的作業系統的話,應該對每天都會用到的檔案總管很熟悉吧,你可以照以下步驟做:先打開檔案總管並將目錄指向”桌面”,這個時後你會在右邊的清單中看到因為懶得整理而散亂在桌面上的所有檔案,現在直接在桌面上隨便選一個沒有用的檔案然後按F2更改檔名,這時後檔案總管發現你偷改檔名所以也再右邊的清單中自動更新檔名了,真是厲害…。

我知道很多人看到這裡大概正準備按”上一頁”離開了,這不過是件普通的不能在普通的事,但如果你正巧不是很忙的話還請稍等一下,我正開始要告訴你如何在程式中運用這平凡又好用的功能。

在.NET龐大的類別庫中有一個FileSystemWatcher物件,它擁有接收來自作業系統中對於檔案更動訊息的能力,為了讓你能快速的認識它我打算寫一個小小的程式示範如何監看檔案的異動。



這是一個視窗程式,我在程式中宣告了一個FileSystemWatcher物件,並關將Path屬性設定為 “d:\Temp”、Filter屬性設為”*.*”、這表示FileSystemWatcher會監看d:\Temp下的所有檔案另外我還將IncludeSubdirectories屬性設為true,這會讓FileSystemWatcher連同d:\Temp目錄下的子目錄也納入監看的範圍,fsw.Renamed += new RenamedEventHandler(fsw_Renamed);這行則是用來引發檔案更名事件,這樣一來FileSystemWatcher可能接收到Rename的通知,最後的 EnableRaisingEvents = true 就會開使在背景執行緒中進行檔案的監看。

現在只要d:\Temp 目錄下有任何檔案名稱被改變就會自動顯示於視窗中。

 
FileSystemWatcher除了Renamed事件外還有Create、Changed、Deleted三個事件,分別可以監看檔案的新增、更改及刪除,利用這幾個事件你可以發揮創意做出很多令人驚奇的效果,比如說資料檔被修改後自動重新讀取並顯示新的資料,程式甚至不需要重新啟動,當然也許人們會因為太習慣而遺忘它所帶來的便利,不過這真的是體貼使用者的良好設計。

八月 01, 2006

序列化儲存物件

| 原始連結

在物件導向的世界裡物件就是所有的一切,所以接下來不論我們在討論什麼都東西都會跟物件的處理有關,在C#中一個物件的產生到消滅無非就是從一個new開始到Dispose()或是object = null的過程,可惜光是這樣還不夠,在大多數的應用系統中我們還必須在物件被消滅之前把它儲存起來。把所有物件的欄位都存在資料庫裡?嗯,這主意聽起來很棒,但如果沒有資料庫呢?不是所有程式都要先安裝SQL2000或是Oracle才能存檔對吧?至少我想儲存一個Word文件檔或是Excel表單時不必安裝資料庫,所以我要說的不是用Database來儲存資料,而是要把資料以檔案型式儲存,也就是說要把程式中的物件變成長長的0與1然後讓它安靜的躺在硬碟裡直到下次我想起它。

假設我們要處理「員工」類別,它的屬性有員工編號、姓名及薪水,大老闆有一天閒來無事就把員工資料輸入系統中存檔以便下次舉行年度扣薪大會時可以拿出來看看誰耗用公司人事成本最高,我們的「員工」類別如下,這個「員工」類別被標記了Serializable()的Attribute,這是物件被能否被序列化處理的必要屬性(Attribute)。




現在大老闆輸入了第001號員工Jack,他的月薪是10萬元,並且把他存檔,程式l碼看起來如下,我們只要用BinaryFormatter格式子就能輕易的讓被標記為Serializable()的物件存進一個二進位檔案中了。


另外讀取到物件中的方法也是用BinaryFormatter


利用Serializable()的Attribute與BinaryFormatter格式字我們可以在沒有資料庫的環境下將物件儲存成二進位檔案,但是我還想要跟你提醒一下,除了二進位檔案.NET還能用簡單的方式將物件XML序列化,配合SOAP格式的XML序列化可以讓物件資料以HTTP 透過網際網路在用戶端和伺服器之間傳輸它,至於實際上的做法我就不介紹了,有需要的話你可以在MSDN中的範例學習到這項有用的技巧,而且基本觀念跟本編的Binary序列化差不了多少。