Windows 8.1 之文件
Windows 8.1 Preview 為應(yīng)用內(nèi)文件管理提供增強(qiáng)支持,應(yīng)用可訪問的用戶庫選擇范圍更寬以及可以將應(yīng)用的唯一內(nèi)容推送至 Windows 索引。 這意味著你的應(yīng)用可輕松訪問用戶內(nèi)容并且使其自身內(nèi)容輕松顯示給其他應(yīng)用。
Windows 8.1 Preview 中的新特性或更新
- 更新后的文件選取器支持新的應(yīng)用顯示模式
- 應(yīng)用內(nèi)的用戶庫管理
- 檢索父文件或文件夾
- 使用 IsEqual 來比較文件
- 新增的 KnownFolders 屬性
- 文件檢索時(shí)無錯(cuò)誤處理要求
- 在打開(方式)應(yīng)用場(chǎng)景中允許查看文件
- 將應(yīng)用內(nèi)容添加到 Windows 索引中
- Microsoft SkyDrive
- DDS 圖像文件支持
更新后的文件選取器支持新的應(yīng)用顯示模式
在 Windows 8.1 Preview 中,以拆分屏幕和全屏顯示方式運(yùn)行的應(yīng)用可以調(diào)用文件選取器。這有助于用戶操作,并且可以根據(jù)他們的需要,執(zhí)行多項(xiàng)任務(wù)。例如,假如用戶在一個(gè)窗口中打開 了 Skype 會(huì)話,而在另一窗口中打開了電子郵件應(yīng)用,電子郵件應(yīng)用可以為用戶打開文件選取器以便包含一個(gè)附件,而此時(shí)應(yīng)用無需轉(zhuǎn)成全屏顯示。若要了解有關(guān)使用文件選 取器的詳細(xì)信息,請(qǐng)參閱快速入門:使用文件選取器訪問文件。
應(yīng)用內(nèi)的用戶庫管理
Windows 8.1 Preview 引入了 StorageLibrary 類,該類允許用戶在應(yīng)用內(nèi)管理其個(gè)人庫(例如“音樂”和“視頻”)中的文件夾。這在媒體庫應(yīng)用中特別有用,因?yàn)橛脩敉ǔP枰砑雍写罅繄D像、音樂或視頻的文件夾來擴(kuò)展其集合。
經(jīng)過特殊化處理的文件選取器可以實(shí)現(xiàn)上述需求,使用 StorageLibrary 方法進(jìn)行調(diào)用后,允許用戶將文件夾添加到他們的庫中。用戶不再需要退出應(yīng)用并轉(zhuǎn)到桌面上來擴(kuò)展他們的媒體集合。
Note 新的 StorageLibrary 類還可以定義一個(gè)從庫中刪除文件的方法,但是若要在應(yīng)用中實(shí)現(xiàn)該功能,則需要自定義的 UI 元素。
檢索父文件或文件夾
Windows 8 的存儲(chǔ) API 沒有定義直接檢索存儲(chǔ)項(xiàng)的父文件夾的方法,所以要求你編寫自己的自定義邏輯。在 Windows 8.1 Preview 中,你可以使用 GetParentAsync 方法獲取文件或文件夾的父 StorageFolder。
Important 要讓 GetParentAsync 方法成功,你必須擁有對(duì)父級(jí)的訪問權(quán)限,可通過聲明庫能力或在未來訪問列表中保留更高級(jí)的文件夾實(shí)現(xiàn)。 此外,如果你無法訪問父文件或文件夾,此方法也不會(huì)拋出異常,而是返回 null。
使用 IsEqual 來比較文件
若要直接比較各個(gè)存儲(chǔ)項(xiàng)以確定它們是否表示的是相同的項(xiàng),Windows 8 的存儲(chǔ) API 并沒有定義此方法。開發(fā)人員通過比較路徑來解決這個(gè)問題,然而他們?nèi)钥赡軙?huì)遇到不具備路徑值的存儲(chǔ)項(xiàng)。在 Windows 8.1 Preview 中,你可以使用 IsEqual 方法來確定兩個(gè)存儲(chǔ)項(xiàng)是否顯示的是相同的文件。
下面的示例顯示了如何使用新方法比較兩個(gè)存儲(chǔ)文件是否相同。
- function openNewFile() {
- var picker = new Windows.Storage.Pickers.FileOpenPicker;
- picker.fileTypeFilter.replaceAll(["*"]);
- picker.pickSingleFileAsync().then(function (file) {
- var alreadyOpenedFile = null;
- _openFiles.some(function (openFile) {
- if (file.IsEqual(openFile.file)) {
- alreadyOpenedFile = openFile;
- return true;
- }
- return false;
- });
- if (alreadyOpenedFile != null) {
- alreadyOpenedFile.window.activate();
- } else {
- createNewFileViewerWindow(file);
- }
- });
- }
新增的 KnownFolders 屬性
Windows 8.1 Preview 引入了兩個(gè)新 KnownFolders 屬性,這允許你在兩個(gè)其他的位置訪問文件:CameraRoll 和 Playlists。
KnownFolders.CameraRoll 屬性允許你訪問使用設(shè)備相機(jī)拍攝的圖片—這跟現(xiàn)有的 Windows Phone 8 屬性相似。KnownFolders.Playlists 屬性允許你訪問用戶的播放列表
文件檢索時(shí)無錯(cuò)誤處理要求
Windows 8.1 Preview 引入的 StorageFolder.TryGetItemAsync 方法允許應(yīng)用嘗試按照名稱來檢索文件或文件夾,無需在應(yīng)用代碼中添加錯(cuò)誤捕捉邏輯。如果找不到文件或文件夾,TryGetItemAsync 返回 null,并不拋出異常。因?yàn)樵摲椒ǚ祷?null,你也可以使用它來確定是否存在特定的文件或文件夾。
在打開(方式)應(yīng)用場(chǎng)景中允許查看文件
在 Windows 8.1 Preview 中,你可以使用 NeighboringFilesQuery 屬性,瀏覽激活應(yīng)用的文件周圍的文件。
在 Windows 8 中,使用特定文件關(guān)聯(lián)打開內(nèi)容的默認(rèn)應(yīng)用只能獲得一個(gè)代表所調(diào)用文件的對(duì)象。 這對(duì)于媒體庫應(yīng)用而言是一個(gè)問題,因?yàn)橛脩粝M麨g覽周圍的文件。在 Windows 8.1 Preview 中,默認(rèn)應(yīng)用可以獲得周圍 視圖中的文件集合—即從中選擇所調(diào)用文件的集合。
你的應(yīng)用需要聲明特定的庫功能,以便獲取相應(yīng)類型的條目。 例如,若要獲取 NeighboringFilesQuery 中的圖片,應(yīng)用必須聲明“圖片庫”功能。
本示例顯示了如何檢索激活應(yīng)用的文件周圍的文件集合。
- function activated(sender, e) {
- if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.file && e.files.size > 0) {
- var invokedFile = e.detail.files[0];
- var neighboringFiles = e.detail.neighboringFilesQuery;
- if (neighboringFiles) {
- result.neighboringFiles.findStartIndexAsync(e.detail.files[0]).done(function (index) {
- var invokedFileElement = document.getElementById("invokedFile");
- invokedFileElement.textContent = "Invoked item: " + invokedFile.name + ", at index " + index + " in view file enumeration.";
- var prevFileslist = document.getElementById("prevFilesList");
- result.neighboringFiles.getFilesAsync(0, index).done(function (fileList) {
- fileList.forEach(function (file) {
- // Create an entry in the list for the file.
- var fileItemElement = document.createElement("li");
- fileItemElement.textContent = file.name;
- prevFileslist.appendChild(listItemElement);
- });
- },
- function (error) {
- // Handle error trying to get list of files.
- });
- var nextFileslist = document.getElementById("nextFilesList");
- result.neighboringFiles.getFilesAsync(index + 1, -1).done(function (fileList) {
- fileList.forEach(function (file) {
- // Create an entry in the list for the file.
- var fileItemElement = document.createElement("li");
- fileItemElement.textContent = file.name;
- nextFileslist.appendChild(listItemElement);
- });
- },
- function (error) {
- // Handle error trying to get list of files.
- });
- },
- function (error) {
- // Handle error trying to get file index.
- });
- }
- }
- }
- app.addEventListener("activated", activated);
#p#
將應(yīng)用內(nèi)容添加到 Windows 索引中
在 Windows 8.1 Preview 中,可以直接將應(yīng)用內(nèi)容添加到 Windows 索引。將應(yīng)用內(nèi)容添加到索引中可以確保在使用 ApplicationIndexedContent 文件夾的查詢或使用新增的應(yīng)用內(nèi)搜索控件時(shí),快速搜索應(yīng)用內(nèi)容。你可以使用 Windows.Storage.Search 中新增的 API 集,或者通過創(chuàng)建 "appcontent-ms" 文件,在索引中添加文件屬性和內(nèi)容。
SkyDrive
在 Windows 8.1 Preview 中,SkyDrive 提供兩項(xiàng)全新的功能更新:
- 文件存儲(chǔ)
讓 SkyDrive 成為用戶文檔、圖片和視頻的默認(rèn)存儲(chǔ)位置,可將 SkyDrive 輕松集成到你的應(yīng)用。只要實(shí)例化應(yīng)用中的 FileSavePicker 或 FileOpenPicker 對(duì)象,默認(rèn)情況下文件選取器就會(huì)打開 SkyDrive。但用戶必須登錄自己的 Microsoft 帳戶才能實(shí)現(xiàn)此操作。(也可將文件選取器的 SuggestedStartLocation 屬性設(shè)置到非 SkyDrive 的位置。)
- SkyDrive 存儲(chǔ)管理工具
我們改進(jìn)了 Windows 8.1 Preview 上的 SkyDrive 存儲(chǔ)配額管理體驗(yàn)。用戶可直接從 Windows 管理 SkyDrive,無需轉(zhuǎn)到 skydrive.com。他們可查看存儲(chǔ)使用情況、升級(jí)存儲(chǔ)計(jì)劃并回收 SkyDrive 上的空間,完全無需離開 Windows 8.1 Preview 界面。
DDS 圖像文件支持
使用 JavaScript 和可擴(kuò)展應(yīng)用程序標(biāo)記語言 (XAML) WebView 控件的 Windows 應(yīng)用商店應(yīng)用現(xiàn)在支持 Microsoft DirectDraw 表面 (DDS) 文件格式,從而使你能夠創(chuàng)建運(yùn)行速度更快的 WebGL 應(yīng)用,這類應(yīng)用即使是在使用較大紋理的情況下,也能更快速地運(yùn)行 。
關(guān)于塊壓縮和 DDS
塊壓縮 (BC) 是一種用于在 DirectDraw 表面 (DDS) 文件中存儲(chǔ)像素?cái)?shù)據(jù)的壓縮類。與其他圖像文件格式不同,圖形處理器 (GPU) 可以直接從塊壓縮格式中采樣,而無需任何解壓縮或處理,從而能夠改進(jìn)在 Windows 應(yīng)用商店應(yīng)用中加載紋理資源的性能。對(duì)于 BC 格式,平均每個(gè)像素使用 4-8 位,而對(duì)于常規(guī)的 RGBA 紋理,每個(gè)像素使用 32 位。因此,塊壓縮格式還能將總 GPU 內(nèi)存使用量降低多達(dá) 87.5%,從而允許在 Windows 應(yīng)用商店應(yīng)用中使用大量或較高質(zhì)量的資產(chǎn)。
盡管有很多塊壓縮算法,但 Windows 8.1 Preview 上使用 JavaScript 和 XAML WebView 控件的 Windows 應(yīng)用商店應(yīng)用在 DDS 文件格式中只支持三種類型的塊壓縮:BC1、BC2 和 BC3。由于經(jīng)過塊壓縮的 DDS 圖像幾乎不需要任何 CPU 解碼時(shí)間,因此它的加載速率比 JPEG 圖像快得多,同時(shí)由于塊壓縮使用的 GPU 內(nèi)存較少,你還可以使用更多的紋理資源。經(jīng)過塊壓縮的 DDS 文件是適用于內(nèi)置游戲背景和紋理的理想圖像格式。
如何在 DDS 文件中使用塊壓縮
在使用 JavaScript 或 XAMLWebView 控件的 Windows 應(yīng)用商店應(yīng)用中將你的圖像資產(chǎn)轉(zhuǎn)換為塊壓縮格式時(shí),需要考慮以下限制:
- 僅支持與以下 DXGI_FORMAT 枚舉值對(duì)應(yīng)的 BC1、BC2 和 BC3 塊壓縮格式:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
- 必須使用預(yù)乘 Alpha。支持使用顯式定義預(yù)乘 Alpha(DXT1、DXT2 和 DXT4)的格式的舊 DDS 文件,以及使用 DDS_HEADER_DX10 結(jié)構(gòu)和有效 DDS_ALPHA_MODE 值(DDS_ALPHA_MODE_OPAQUE 和 DDS_ALPHA_MODE_PREMULTIPLIED)的新 DDS 文件。
- X 和 Y 維度必須是 4 像素的倍數(shù)。
- DDS 中不支持立體紋理、立方圖、mipmap 或紋理格式。
如果你不遵守這些限制,你的 DDS 文件將無法加載到使用 JavaScript 或 XAML WebView 控件的 Windows 應(yīng)用商店應(yīng)用中。有關(guān)詳細(xì)信息,請(qǐng)參閱此鏈接。
在 DDS 文件中創(chuàng)建塊壓縮資產(chǎn)后,可以在標(biāo)記中加載 DDS 文件,或通過 JavaScript 進(jìn)行加載:
HTML
- <img src=”sample.dds” />
JavaScript
- var img = new Image();
- img.src = “sample.dds”;
何時(shí)使用塊壓縮格式
如上所述,經(jīng)過塊壓縮的 DDS 文件可顯著增加你能夠在 Windows 應(yīng)用商店應(yīng)用中使用的較大紋理的數(shù)量,并且可以提高應(yīng)用的加載速度。但是,盡管經(jīng)過塊壓縮的 DDS 文件在 GPU 內(nèi)存使用方面更加高效,而與 JPEG 文件相比,卻占用較多的磁盤空間。經(jīng)過塊壓縮的 DDS 文件格式不適合通過網(wǎng)絡(luò)下載,因此最好將這類文件用作應(yīng)用程序包中的本地資產(chǎn)。盡管在 Internet Explorer 11 Preview 上支持經(jīng)過塊壓縮的 DDS 文件,但由于需要較高的網(wǎng)絡(luò)成本,因此不推薦在 Web 上使用這種格式。
由于塊壓縮格式會(huì)降低質(zhì)量,因此就像使用其他類似的格式那樣,必須確保在轉(zhuǎn)換為塊壓縮格式時(shí)不會(huì)降低視覺質(zhì)量。塊壓縮對(duì)于真實(shí)的“自然”圖像處理效果非常好,但對(duì)于強(qiáng)烈的漸變和色移會(huì)出現(xiàn)失真。
原文鏈接:http://msdn.microsoft.com/zh-cn/library/windows/apps/bg182881.aspx