第二十章:非同步和檔案I/O.(八)

wangccsy發表於2018-11-21

檔案輸入/輸出

傳統上,檔案輸入/輸出是最基本的程式設計任務之一,但移動裝置上的檔案I / O與桌面上的檔案I / O略有不同。在桌面上,使用者和應用程式通常可以訪問整個磁碟以及可能還有其他驅動器,所有這些驅動器都被組織到目錄結構中。在移動裝置上,存在若干標準資料夾 – 例如圖片或音樂 – 但是特定於應用程式的資料通常限於每個應用程式專用的儲存區域。
熟悉.NET的程式設計師知道System.IO名稱空間包含大量標準檔案I / O支援。在這裡您可以找到關鍵的Stream類,它提供了讀取和寫入組織為位元組流的資料的基礎。在此基礎上構建了幾個Reader和Writer類以及允許訪問檔案和目錄的其他類。也許檔案中最方便的檔案是檔案本身,它不僅提供了一組方法來建立新檔案和開啟現有檔案,還包括幾個能夠在一個檔案中執行整個檔案讀取或檔案寫入操作的靜態方法。單方法呼叫。
特別是如果您正在使用文字檔案,File類的這些靜態方法可能非常方便。例如,File.WriteAllText方法有兩個型別為string-a file?name和檔案內容的引數。該方法建立檔案(如果需要,用相同的名稱替換現有檔案),將內容寫入檔案,然後關閉它。 File.ReadAllText方法類似,但在一個大字串物件中返回檔案的內容。這些方法非常適合編寫和閱讀文字檔案,而且操作簡便。
起初,檔案I / O似乎不需要非同步操作,在實踐中,有時您可以選擇,有時您可以避免非同步操作。
但是,其他時候你沒有選擇。某些平臺需要檔案I / O的非同步函式,即使不需要它們,也可以避免在使用者介面執行緒中執行檔案I / O。
好訊息和壞訊息
您的Xamarin.Forms應用程式引用的Xamarin.iOS和Xamarin.Android庫包括Xamarin為這兩個移動平臺明確定製的.NET版本。 System.IO名稱空間中的File類中的方法對映到iOS和Android平臺中的相應檔案I / O函式,而靜態Environment.GetFolderPath方法與MyDocuments列舉成員一起使用時,返回應用程式本地的目錄儲存。這意味著您可以在File類中使用簡單方法 – 包括在iOS和Android應用程式中在單個呼叫中執行整個檔案寫入或讀取操作的靜態方法。
為了驗證這些類的可用性,讓我們進行一些實驗:進入Visual Studio或Xamarin Studio並載入到目前為止建立的任何Xamarin.Forms解決方案。在iOS或Android專案中建立一個程式碼檔案。在建構函式或方法中,鍵入System.IO名稱空間名稱,然後鍵入句點。您將獲得名稱空間中所有可用型別的列表。如果然後鍵入File和句點,您將獲得File類中的所有靜態方法,包括WriteAllText和ReadAllText。
但是,在Windows 8.1和Windows Phone 8.1專案中,您正在使用Microsoft專門為這些平臺建立的.NET版本。如果鍵入System.IO和句點,則根本不會看到File類!它不存在! (但是,您會發現它確實存在於UWP專案中。)
現在進入Xamarin.Forms可移植類庫專案中的任何程式碼檔案。您可能還記得,Xamarin.Forms的PCL針對以下平臺:

  • .NET Framework 4.5
  • Windows 8
  • Windows Phone 8.1
  • Xamarin.Android
  • Xamarin.iOS
  • Xamarin.iOS (Classic)

正如您可能已經預料到的那樣,PCL中的System.IO名稱空間也缺少File類。 PCL配置為支援多個目標平臺。 因此,在PCL內實現的API必然是這些目標平臺中的API的交集。
從Windows 8和Windows Runtime API開始,Microsoft完全修改了檔案I / O並建立了一組全新的類。 您的Windows 8.1,Windows Phone 8.1和UWP應用程式使用Windows.Storage名稱空間中的類來進行檔案I / O.
如果您只在Xamarin.Forms應用程式中定位iOS和Android,則可以在兩個平臺之間共享檔案I / O程式碼。 您可以使用靜態File方法和System.IO中的所有其他方法。
如果您還想要定位Windows或Windows Phone平臺之一,則需要為每個平臺的不同檔案I / O邏輯使用DependencyService(在第9章“特定於平臺的API呼叫”中討論)。


相關文章