第二十章:異步和文件I/O.(八)

文件輸入/輸出

傳統上,文件輸入/輸出是最基本的編程任務之一,但移動設備上的文件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調用”中討論)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章