C# uwp應用的文件讀寫最常見錯誤就是沒有權限。
而最簡單的方法是對已知的文件路徑進行訪問
已知的文件路徑常見的是自身的路徑
權限這個和之前不同,UWP讀寫文件多用`StorageFile`來讀寫文件
[TOC]
`StorageFile`沒有直接的打開一個文件的做法,而是通過`StorageFolder`創建,打開文件來進行。
下面代碼需要`using Windows.Storage;`
## 獲取應用目錄的文件夾
~~~
StorageFolder folder;
folder = ApplicationData.Current.LocalFolder;
~~~
## 創建文件
獲取后,這里不需要權限,可以直接創建文件
~~~
folder.CreateFileAsync(file_name , CreationCollisionOption.ReplaceExisting);
~~~
其中`ApplicationData.Current`Current的值可以是 LocalCacheFolder 本地臨時文件夾,LocalFolder 本地文件夾,LocalSettings 本地設置,RoamingFolder 漫游文件夾,RoamingSettings 漫游設置
創建文件的時候可以選擇,如果存在了文件的選擇`CreationCollisionOption`里ReplaceExisting 如果文件或文件夾已存在,則替換現有的項
FailIfExists 默認值 如果文件或文件夾已存在,則引發類型為 System.Exception 的異常。
還有用的比較少的選項。
## 創建文件夾
創建文件夾和創建文件也是一樣
先獲取本地的文件夾`StorageFolder folder;
folder = ApplicationData.Current.LocalFolder;`
創建文件夾
~~~
folder.CreateFolderAsync(folder_name,CreationCollisionOption.ReplaceExisting);
~~~
為了顯示已經做的,我做了一個函數來顯示`void notify(string str)`
把做出來的東西顯示出來
## 讀寫文件
把創建的文件存為`file_demonstration`,對`file_demonstration`讀寫
可以把這個新的東西變為熟悉的
需要`using System.IO;`
~~~
Stream file = await file_demonstration.OpenStreamForWriteAsync()
~~~
這樣讀寫就很簡單
寫文件代碼
~~~
using (Stream file = await file_demonstration.OpenStreamForWriteAsync())
{
using (StreamWriter write = new StreamWriter(file))
{
write.Write("寫入");
}
}
~~~
讀文件
~~~
string s;
using (Stream file = await file_demonstration.OpenStreamForReadAsync())
{
using (StreamReader read = new StreamReader(file))
{
s = read.ReadToEnd();
}
}
~~~
微軟官方的讀寫文件
`using Windows.Storage.Streams;`
寫文件
~~~
using (StorageStreamTransaction transaction = await file_demonstration.OpenTransactedWriteAsync())
{
using (DataWriter dataWriter = new DataWriter(transaction.Stream))
{
dataWriter.WriteString(str);
transaction.Stream.Size = await dataWriter.StoreAsync();
await transaction.CommitAsync();
}
}
~~~
讀文件
~~~
using (IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read))
{
using (DataReader dataReader = new DataReader(readStream))
{
UInt64 size = readStream.Size;
if (size <= UInt32.MaxValue)
{
UInt32 numBytesLoaded = await dataReader.LoadAsync((UInt32)size);
string fileContent = dataReader.ReadString(numBytesLoaded);
}
}
}
~~~
## 別的文件夾
我們用軟件安裝目錄的時候還是比較少,我們需要用到的文件夾還有很多,現在下面就有一些系統文件夾可以使用
圖片庫
選圖片庫可以使用`folder_demonstration = KnownFolders.PicturesLibrary;`
在生成前在清單請求權限


除了圖片庫還有很多,在`KnownFolders`可以看到,使用前需要請求權限。
還有下載文件`DownloadsFolder`
`folder_demonstration = DownloadsFolder.CreateFolderAsync(folder_name);`
## 選取文件
系統給的我們有時候還需要用戶選的文件
選取文件需要`Windows.Storage.Pickers.FileOpenPicker`,使用`picker.PickSingleFileAsync()`來出現選擇界面
在使用`picker.PickSingleFileAsync()`要設置后綴,選擇文件的后綴`picker.FileTypeFilter.Add(".txt");`
一般我們有推薦第一次使用選擇進入的文件夾`picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;`
選取文件夾和選取文件一樣
~~~
Windows.Storage.Pickers.FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
folderPicker.FileTypeFilter.Add(".txt");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
{
notify("選擇" + folder.Name);
folder_demonstration = folder;
}
~~~
全部代碼
~~~
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.Storage.Streams;
namespace file
{
public class model
{
public model()
{
//C# uwp應用的文件讀寫最常見錯誤
//就是沒有權限。
//而最簡單的方法是對已知的文件
//路徑進行訪問
//自身的路徑
ce();
}
/// <summary>
/// 結果
/// </summary>
public string result
{
set
{
_result.Add(value);
}
get
{
StringBuilder t = new StringBuilder();
foreach (string s in _result)
{
t.Append(s);
}
return t.ToString();
}
}
public async void ce()
{
//創建文件
await create_ApplicationData("測試.txt");
//創建文件夾
await folder_ApplicationData("在安裝的路徑創建不需要權限");
//讀寫文件和以前一樣
await write_ApplicationData();
await read_ApplicationData();
//如果要讀寫別的地方的文件,可以用
//folder_demonstration = KnownFolders.PicturesLibrary;
//要在清單請求權限
//DownloadsFolder 下載文件夾這里也可以
//folder_demonstration = DownloadsFolder.CreateFolderAsync(folder_name);
//也可以讓用戶選
}
private StorageFile file_demonstration;//UWP 采用StorageFile來讀寫文件
private StorageFolder folder_demonstration;//folder來讀寫文件夾
/// <summary>
/// 自身路徑創建文件
/// </summary>
/// <param name="file_name">要創建文件名字</param>
/// <returns>已經創建的文件</returns>
public async Task create_ApplicationData(string file_name)
{
StorageFolder folder;
folder = ApplicationData.Current.LocalFolder;
//Current的值可以是
//LocalCacheFolder 本地臨時文件夾
//LocalFolder 本地文件夾
//LocalSettings 本地設置
//RoamingFolder 漫游文件夾
//RoamingSettings 漫游設置
file_demonstration = await folder.CreateFileAsync(file_name , CreationCollisionOption.ReplaceExisting);
//CreationCollisionOption 可以選擇
// 如果文件或文件夾已存在,則自動為指定名稱的基礎追加一個編號。例如,如果 MyFile.txt 已存在,則新文件名為 MyFile (2).txt。如果 MyFolder
// 已存在,則新文件夾名為 MyFolder (2)。
//GenerateUniqueName
//ReplaceExisting 如果文件或文件夾已存在,則替換現有的項。
//FailIfExists 默認值 如果文件或文件夾已存在,則引發類型為 System.Exception 的異常。
//OpenIfExists 如果文件或文件夾已存在,則返回現有的項。
notify("創建文件成功,文件路徑" + file_demonstration.Path);
}
/// <summary>
/// 自身路徑創建文件夾
/// </summary>
/// <param name="file_name">要創建文件夾名字</param>
/// <returns>已經創建的文件夾</returns>
public async Task folder_ApplicationData(string folder_name)
{
StorageFolder folder;
folder = ApplicationData.Current.LocalFolder;
folder_demonstration = await folder.CreateFolderAsync(folder_name , CreationCollisionOption.ReplaceExisting);
notify("創建文件夾成功,文件夾路徑" + folder_demonstration.Path);
}
/// <summary>
/// 對自身路徑進行文件讀寫
/// </summary>
public async Task write_ApplicationData()
{
using (Stream file = await file_demonstration.OpenStreamForWriteAsync())
{
using (StreamWriter write = new StreamWriter(file))
{
write.Write("寫入");
}
}
//using (StorageStreamTransaction transaction = await file_demonstration.OpenTransactedWriteAsync())
//{
// using (DataWriter dataWriter = new DataWriter(transaction.Stream))
// {
// dataWriter.WriteString(str);
// transaction.Stream.Size = await dataWriter.StoreAsync();
// await transaction.CommitAsync();
// }
//}
notify("寫入文件成功");
}
/// <summary>
/// 讀文件
/// </summary>
public async Task read_ApplicationData()
{
string s;
using (Stream file = await file_demonstration.OpenStreamForReadAsync())
{
using (StreamReader read = new StreamReader(file))
{
s = read.ReadToEnd();
}
}
notify("讀文件\"" + s + "\"");
}
public async Task file_open()
{
Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
//顯示方式
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
//選擇最先的位置
picker.SuggestedStartLocation =
Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
//后綴名
picker.FileTypeFilter.Add(".txt");
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
notify("選擇 " + file.Name);
file_demonstration = file;
}
}
public async Task folder_open()
{
Windows.Storage.Pickers.FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
folderPicker.FileTypeFilter.Add(".txt");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
{
notify("選擇" + folder.Name);
folder_demonstration = folder;
}
}
private List<string> _result = new List<string>();
private void notify(string str)
{
_result.Add(str + "\r\n");
}
}
}
~~~
[https://code.csdn.net/lindexi_gd/uwp_write_read_file](https://code.csdn.net/lindexi_gd/uwp_write_read_file)
- 前言
- UWP win10 app 新關鍵字x:Bing
- win10應用 UWP 使用MD5算法
- win10 UWP讀寫文件
- UWP appButtonBar樣式
- C# 6.0 $&quot;Hello {csdn}&quot;
- Win10 UWP xaml 延遲加載元素
- UWP xaml 圓形頭像
- UWP 繪制圖形
- win10 uwp 通知Toast
- win10 UWP 顯示地圖
- win10 uwp 參考
- win10 uwp clone
- win10 uwp 裝機必備應用 含源代碼
- RichEditBox 使用自定義菜單
- win10 UWP FlipView
- win10 UWP 獲取系統信息
- win10 UWP 申請微軟開發者
- win10 UWP button
- win10 UWP Markdown 含源代碼
- win10 UWP 應用設置
- win10 UWP 九幽數據分析
- win10 UWP 圓形等待
- win10 UWP 標題欄后退
- win10 UWP 單元測試
- win10 UWP 你寫我讀
- win10 UWP RSS閱讀器
- win10 UWP MessageDialog 和 ContentDialog
- win10 UWP Hmac
- win10 UWP GET Post
- Win10 UWP Intro to controls and events
- win10 UWP Controls by function
- win10 uwp App-to-app communication 應用通信