中的檔案處理 Xamarin.Forms

Download Sample 下載範例

使用的檔案處理 Xamarin.Forms 可以使用 .NET Standard 連結庫中的程式碼,或使用內嵌資源來達成。

概觀

Xamarin.Forms 程式代碼會在多個平台上執行 - 每個平臺都有自己的文件系統。 在過去,這表示在每個平台上使用原生檔案 API 最容易執行讀取和寫入檔案。 或者,內嵌的資源是更簡單的散發資料檔案與應用程式解決方案。 不過,使用 .NET Standard 2.0 就可以在 .NET Standard 程式庫中共用檔案存取碼。

如需處理影像檔的相關資訊,請參閱處理影像頁面。

儲存及載入檔案

System.IO 類別可用來存取每個平台上的檔案系統。 File 類別可讓您建立、刪除和讀取檔案,而 Directory 類別可讓您建立、刪除或列舉目錄內容。 您也可以使用 Stream 子類別,其可提供更高的檔案作業控制權 (例如壓縮或在檔案中搜尋位置)。

您可以使用 File.WriteAllText 方法撰寫文字檔:

File.WriteAllText(fileName, text);

您可以使用 File.ReadAllText 方法讀取文字檔:

string text = File.ReadAllText(fileName);

此外,File.Exists 方法可以判斷指定的檔案是否存在:

bool doesExist = File.Exists(fileName);

使用 Environment.SpecialFolder 列舉的值作為 Environment.GetFolderPath 方法的第一個引數,就可以從 .NET Standard 程式庫判斷每個平台的檔案路徑。 然後使用 Path.Combine 方法與檔案名稱相結合:

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "temp.txt");

這些作業會在範例應用程式中示範,包括儲存及載入文字的頁面:

Saving and loading text

載入內嵌為資源的檔案

若要將檔案內嵌至 .NET Standard 組件,請建立或新增檔案,並確保建置動作:EmbeddedResource

GetManifestResourceStream 用以存取使用其資源識別碼的內嵌檔案。 根據預設,資源識別碼是其內嵌項目預設命名空間的檔名,在此案例中,元件為 WorkingWithFiles 且檔名 為LibTextResource.txt,因此資源識別碼為 WorkingWithFiles.LibTextResource.txt

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibTextResource.txt");
string text = "";
using (var reader = new System.IO.StreamReader (stream))
{  
    text = reader.ReadToEnd ();
}

然後就可以使用 text 變數顯示文字,或在程式碼中使用它。 範例應用程式的這個螢幕擷取畫面顯示使用 Label 控制項轉譯的文字。

Text file embedded in .NET standard library

載入和還原序列化 XML 一樣簡單。 下列程式碼示範從資源載入並還原序列化 XML 檔案,然後繫結至 ListView 以顯示。 XML 檔案包含 Monkey 物件的陣列 (已使用範例程式碼定義類別)。

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibXmlResource.xml");
List<Monkey> monkeys;
using (var reader = new System.IO.StreamReader (stream)) {
    var serializer = new XmlSerializer(typeof(List<Monkey>));
    monkeys = (List<Monkey>)serializer.Deserialize(reader);
}
var listView = new ListView ();
listView.ItemsSource = monkeys;

Xml file embedded in .NET standard library, displayed in ListView

在共用專案中內嵌

共用專案也可以將檔案包含為內嵌資源,但因為共用專案的內容會編譯到參考專案,所以用於內嵌檔案資源識別碼的前置詞會變更。 這表示每個平台的每個內嵌檔案資源識別碼可能不相同。

共用專案的這個問題有兩個解決方案:

  • 同步專案 - 編輯每個平台的專案屬性,使用相同的組件名稱和預設命名空間。 然後,這個值就會「硬式編碼」為共用專案的內嵌資源識別碼前置詞。
  • #if 編譯器指示詞 - 使用編譯器指示詞設定正確的資源識別碼前置詞,並使用該值以動態方式建構正確的資源識別碼。

以下為示範第二個選項的程式碼。 編譯器指示詞用以選取硬式編碼的資源前置詞 (一般和參考專案的預設命名空間相同)。 然後串連資源前置詞與內嵌的資源檔案名稱,使用 resourcePrefix 變數建立有效的資源識別碼。

#if __IOS__
var resourcePrefix = "WorkingWithFiles.iOS.";
#endif
#if __ANDROID__
var resourcePrefix = "WorkingWithFiles.Droid.";
#endif

Debug.WriteLine("Using this resource prefix: " + resourcePrefix);
// note that the prefix includes the trailing period '.' that is required
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream
    (resourcePrefix + "SharedTextResource.txt");

組織資源

上述範例假設該檔案內嵌在 .NET Standard 程式庫專案的根目錄中;在這種情況下,資源識別碼就是表單 Namespace.Filename.Extension 的資源識別碼,例如 WorkingWithFiles.LibTextResource.txtWorkingWithFiles.iOS.SharedTextResource.txt

您可以使用資料夾組織內嵌的資源。 當內嵌的資源放置在某個資料夾中時,資料夾名稱會成為資源識別碼的一部分 (以句點分隔),以致資源識別碼格式變成 Namespace.Folder.Filename.Extension。 將範例應用程式所用的檔案放到資料夾 MyFolder 中,對應的資源識別碼就會變成 WorkingWithFiles.MyFolder.LibTextResource.txtWorkingWithFiles.iOS.MyFolder.SharedTextResource.txt

偵錯內嵌資源

因為有時很難了解為什麼未載入特定的資源,所以下列偵錯程式碼會暫時新增至應用程式,協助確認已正確設定資源。 它會將內嵌在指定組件中的所有已知資源輸出到 [錯誤] 板,協助偵錯資源載入問題。

using System.Reflection;
// ...
// use for debugging, not in released app code!
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
foreach (var res in assembly.GetManifestResourceNames()) {
    System.Diagnostics.Debug.WriteLine("found resource: " + res);
}

摘要

本文已示範在裝置上儲存及載入文字,以及載入內嵌資源等一些簡單的檔案作業。 使用 .NET Standard 2.0 就可以在 .NET Standard 程式庫中共用檔案存取碼。