Windows Vista 開發新特性(2)- 你的檔案存在哪?

來源:互聯網
上載者:User
 

Windows Vista 開發新特性(2)- 你的檔案存在哪?

其實這不能算是新特性,充其量算是一個Vista開發最佳實務,但是由於種種原因;基本上所有需要進行Vista相容性升級的軟體產品都會遇到這個問題,究其原因當然有曆史因素,但是歸根到底還是我們的開發不夠規範。

先扯遠一點,軟體開發需要的到底是創新還是規範?我見過很多剛剛畢業的,還有仍然在校的學生把隨意當成創新,把出軌作為炫耀。當我剛剛加入SSW的時候,對公司最大的不適應就是繁多而且詳細的各項規範http://www.ssw.com.au/ssw/standards,上班的第一個月我收到最多的郵件都是提醒我哪裡又違反了哪條規範;但是當我工作了1年以後,我發現這許許多多的標準已經成為了一種習慣,並且在幫我更快更好的完成我的日常工作。曾經聽過這樣的話“優秀是一種習慣”,當你吸取了其他人的經驗,並在每天都不知不覺的使用這些經驗的時候,那麼你會發現做事的效率會大大的提高,並且一切都那麼自然。當然,學習規範的過程是痛苦的,但總歸是有收穫的。回到軟體開發的話題上來,我一直覺得學習編程最好的方式,就是把別人的代碼自己從新寫一邊,編譯並運行。記得上學的時候學習c語言就是這樣,當我吧譚浩強老師的所有代碼都自己編譯了一遍以後,我發現其實編程是那麼簡單。這樣的習慣一直跟隨我學習php,sql,java,.net等任何的新技術。

不好意思,扯得太遠了一點。Vista中的一項重大改進就是UAC的廣泛應用,當我們無法使用管理員權限的時候,我們發現很多以前很簡單的操作變得如此的複雜。比如:我們都習慣於把應用程式的設定檔存放在/Program Files/Application Name/這樣的檔案夾中。這樣的位置到了Vista上,你會發現普通使用者/管理員都無法在不提升許可權的情況下寫入,導致應用程式的崩潰。當然,如果你的程式還沒有添加UAC manifest的話,這一切都不是問題。

檔案系統虛擬重新導向  File System Visualization

關於這一點,我們可以從下面的實驗中發現其中的緣由:

首先使用EditPlus這個工具建立一個文字檔並存放到/Program Files/目錄下:


你會發現程式不會遇到任何問題,檔案可以正常儲存,但是當你使用檔案管理工具開啟/Program Files/目錄的時候,檔案卻不存在。

實際的檔案其實是被“重新定向”到了目前使用者的AppData目錄之下:

其實,這是Vista中向下相容的一項功能:檔案系統虛擬重新導向 (File System Visualization)。其功能就是針對那些還沒有相容Vista的應用程式,把那些對受保護內容的訪問從新定向到使用者具備存取權限的位置,也就是/Users/UserName/AppData/Local/VirualStore/。在這個檔案夾中你可以找到象Program Files, Windows這樣的目錄;因為普通使用者預設情況下沒有對這些目錄的存取權限,所以相應的訪問被定向到了這裡。

當你的程式添加了UAC manifest的時候,那麼同時也就喪失了Vista的這項相容性保護;這個時候你必須在程式中使用正確的路徑,把設定檔,記錄檔等等都寫入到使用者自己的AppData中去。我們可以從下面的記事本示範中看到,由於記事本已經對Vista進行了升級,那麼訪問/program files/目錄將會返回“沒有許可權”的錯誤資訊:

如果我們比較以下EditPlus和記事本的exe檔案,我們就可以看到區別了:

我們會發現記事本exe檔案的manifest中多了以下代碼:

 

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>

 

以上代碼告訴Vista上的UAC,記事本現在使用asInvoker的許可權,也就是和調用者同樣的許可權;我在專門介紹UAC的文章中提到過,Vista上的使用者預設是標準使用者,沒有訪問/program files/的許可權,這就是為什麼記事本會儲存失敗。

多使用者應用環境

從Windows開始支援多使用者開始,其實就已經有了使用者目錄的概念,但是我們一直都沒有在軟體開發中對這個問題作足夠多的重視,造成了很多的應用程式都把一些使用者自己的配置內容寫入到了/program files/application name目錄中。這個問題有很多人不理解,到底那些內容是應該儲存在/program files/application name目錄中,那些應該儲存到/users/username/appdata目錄中。其實我們可以簡單的這樣區分:

/program files/application name:儲存安裝過程中固化的應用程式配置,這些配置不應被個別使用者更改;比如:固定的網關,伺服器位址,應用程式的動態連結程式庫列表,程式版本資訊等。

/users/username/appdata:儲存可以由使用者修改的內容,並且這個設定檔應該是在應用程式第一次啟動並執行時候由程式動態建立的。比如:視窗的位置,大小,上次登入的時間,使用者名稱,cookie等等。

為什麼不能由安裝程式建立這個檔案呢?主要是為了支援無值守的部署情況,這種情況下安裝程式無從知曉個別使用者的具體情況;所以無法正確建立這個檔案。

其實,建立這個檔案最簡單的方式就是使用.net framework 中的ApplicationBlock的Configuration模組,因為它會自動的處理檔案的讀寫和建立;對應用程式是完全透明的。

擷取正確的系統路徑

另外一個問題是如何在應用程式中正確的獲得這些目錄,其實也很簡單,使用Environment.GetFolderPath()這個方法,我們可以輕易的獲得我們需要的目錄:

上面的listView中使用了以下代碼進行填充:

foreach(System.Environment.SpecialFolder folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
...{
    ListViewItem folderItem = new ListViewItem(
                    new string[]...{folder.ToString(), Environment.GetFolderPath(folder)});
    listView1.Items.Add(folderItem);                
}

 

這裡對Environment.SpecialFolder這個枚舉類型進行了遍曆,提取出了系統所有的特殊路徑。其中值得注意:

Enviornment.SpecialFolder.ApplicationData:這個值會指向目前使用者的AppData中的Roaming目錄,這個目錄和local的唯一區別就是當你的AD中配置了漫遊功能的時候,此目錄的內容會被儲存在伺服器上,並在使用者登入其他電腦的時候預先部署。一般是在比較大的企業中為了提供更好的登入環境才使用。

向下相容xp檔案系統

說到這裡大家肯定有疑問,因為在xp上,使用者目錄的路徑是:

/Documents and Settings/,而不是/Users/,會覺得有問題,其實Vista在這一點上早就作了準備。

在一個Vista的環境下輸入了xp的路徑,還是可以正常訪問這個xp風格的目錄。其實這裡Vista借用了一個在unix上使用多年的技術“檔案系統連結”來實現這個功能。

當你鍵入dir /a的時候,出現了很多叫做<Junction>的東西,其實這些就是“檔案系統連結”,Vista使用這些連結把xp風格的目錄指向到了正確的Vista路徑上。以保證xp的應用程式可以正常訪問。如果需要的話,可以使用mklink這個命令來建立需要的連結。

所以,應用程式如果需要向下相容的話,仍然應該使用xp風格的路徑;當然我這裡指的是如果你一定需要寫明(hard code)這些路徑的話;可能的話,盡量使用Environment來得到正確的路徑。

 相關資源

CFF Explorer manifest 查看工具:
http://programmerstools.org/node/307

正確使用Windows Vista UAC標準使用者環境的最佳實務:
Developer Best Practices and Guidelines for Applications in a Least Privileged Environment:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp

相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。