中的檔案處理 Xamarin.Forms
使用的檔案處理 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");
這些作業會在範例應用程式中示範,包括儲存及載入文字的頁面:
載入內嵌為資源的檔案
若要將檔案內嵌至 .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
文字:
載入和還原序列化 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;
在共用專案中內嵌
共用專案也可以將檔案包含為內嵌資源,但因為共用專案的內容會編譯到參考專案,所以用於內嵌檔案資源識別碼的前置詞會變更。 這表示每個平台的每個內嵌檔案資源識別碼可能不相同。
共用專案的這個問題有兩個解決方案:
- 同步專案 - 編輯每個平台的專案屬性,使用相同的組件名稱和預設命名空間。 然後,這個值就會「硬式編碼」為共用專案的內嵌資源識別碼前置詞。
- #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.txt
和 WorkingWithFiles.iOS.SharedTextResource.txt
。
您可以使用資料夾組織內嵌的資源。 當內嵌的資源放置在某個資料夾中時,資料夾名稱會成為資源識別碼的一部分 (以句點分隔),以致資源識別碼格式變成 Namespace.Folder.Filename.Extension。 將範例應用程式所用的檔案放到資料夾 MyFolder 中,對應的資源識別碼就會變成 WorkingWithFiles.MyFolder.LibTextResource.txt
和 WorkingWithFiles.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 程式庫中共用檔案存取碼。