注:本文由BeyondVincent(破船)原创首发
转载请注明出处:BeyondVincent(破船)@DevDiv.com
本文章主要内容如下
1、读取Isolated Storage
2、读取工程中的文件
3、通过文件选取器(File Picker)读取本地文件
4、不通过文件选取器(File Picker)读取本地文件
在Windows 8 Metro开发中开始使用WinRT;在WinRT中有一些新的名称空间----名称空间是在.Net Framework中使用的。可能你认为你知道,但是你可能不知道。
MSDN:在一些情况下,.Net Framework 桌面程序所使用的type,在.NET APIs(Metro style apps)中并不存在。代替的方法是,使用Windows Runtime中的type。例如,System.IO.IsolatedStorage。IsolatedStorageSettings并不包含在.NET APIs(Metro style apps)中,相反Windows.Storage.ApplicationDataContainer提供了存储程序设置的功能.常见的变化例子你可能需要看这里的内容: Converting your existing .NET Framework code。
1、读取Isolated Storage
每个Metro程序都有三个文件夹:Local, Roaming,Temp。每个文件夹的访问方法都是相同的.
Local用于将数据存储在本地,这是程序特定的文件夹.
Roaming存储的文件可能会用于与其他程序进行同步.
Temp中的文件,在程序每次启动的时候都有可能被清除.
下面的代码是如何使用它们:
public async void IsolatedStorage()
{
// settings
var _Name = "MyFileName";
var _Folder = Windows.Storage.ApplicationData.Current.LocalFolder;
var _Option = Windows.Storage.CreationCollisionOption.ReplaceExisting;
// create file
var _File = await _Folder.CreateFileAsync(_Name, _Option);
// write content
var _WriteThis = "Hello world!";
await Windows.Storage.FileIO.WriteTextAsync(_File, _WriteThis);
// acquire file
_File = await _Folder.GetFileAsync(_Name);
// read content
var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File);
}
2、读取工程中的文件
如果你想要从你的工程中读取一个资源文件,这个文件大多数情况下是示例数据或者设置等.可能会是XML文件,JSON文件,或者其它格式.能读取吗?当然可以.
第一步
添加文件到工程中.注意:这是你的文件,你需要处理文件类型.如下图,我添加了一个MyFile.txt文件到MyFolder目录中.
第二步
修改文件的生成操作为内容.并将复制到输出目录修改为始终复制.这将确保文件在程序中.不这样做的话,读取不到文件.
第三步
读取文件内容,代码如下:
private async void ProjectFile()
{
// settings
var _Path = @"MyFolder\MyFile.txt";
var _Folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
// acquire file
var _File = await _Folder.GetFileAsync(_Path);
// read content
var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File);
}
3、通过文件选取器(File Picker)读取本地文件
你想要从文档库中读取文件?那么就使用文件选取器来让用户选择文件.
只需要这样做:
为了使用文件选取器,并不需要做特殊的事情。不要对AppXManifest进行任何改变(原因:使用文件选取器是让用户做出选择,只有用户可以选择文件).因此选取器是对其自己能力的一种声明和同意.
下面是使用的代码
async void LocalFileFromPicker()
{
// define picker
var _Picker = new FileOpenPicker
{
ViewMode = PickerViewMode.List,
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
};
_Picker.FileTypeFilter.Add(".txt");
// let user pick file
var _File = await _Picker.PickSingleFileAsync();
if (_File == null)
{
await new Windows.UI.Popups.MessageDialog("No file").ShowAsync();
return;
}
// read properties
var _Message = string.Format("File date: {0}",
(await _File.GetBasicPropertiesAsync()).DateModified);
await new Windows.UI.Popups.MessageDialog(_Message).ShowAsync();
// read content
var _Content = await Windows.Storage.FileIO.ReadTextAsync(_File);
await new Windows.UI.Popups.MessageDialog(_Content).ShowAsync();
}
在上面的代码中,首先初始化了一个FileOpenPicker.然后调用选取器的PickSingleFileAsync()方法来获取一个StorageFile。接着使用MessageDialog来显示一些详细内容。
4、不通过文件选取器(File Picker)读取本地文件
如果你不想通过文件选取器来读取文件,能做到吗?答案是yes.不过稍微有点复杂,因为需要修改程序的AppXManifest文件,来请求文档库的访问功能.如下图
将文档库访问勾上.这是你可能注意到了功能Tab标题有个红色的X.这表示有错误.如何修改呢.
需要修改声明Tab里面的文件类型
注意,文件类型的设置不能是*.*
如下图(这里我只访问txt文件,所以只添加.txt)
现在,可以读取文件内容了
下面的代码我创建了一个HelloWorld.txt文件,并进行了读写操作.最后,我将该文件删除
async void LocalFileWithoutPicker()
{
var _Name = "HelloWorld.txt";
var _Folder = KnownFolders.DocumentsLibrary;
var _Option = Windows.Storage.CreationCollisionOption.ReplaceExisting;
// create file
var _File = await _Folder.CreateFileAsync(_Name, _Option);
// write content
var _WriteThis = "Hello world!";
await Windows.Storage.FileIO.WriteTextAsync(_File, _WriteThis);
// acquire file
try { _File = await _Folder.GetFileAsync(_Name); }
catch (FileNotFoundException) { /* TODO */ }
// read content
var _Content = await FileIO.ReadTextAsync(_File);
await new Windows.UI.Popups.MessageDialog(_Content).ShowAsync();
await _File.DeleteAsync();
}
上面的代码可以很好的运行,那是因为我在AppXManifest文件中声明了从文档库文件夹中读取txt文件的功能.
如果你在manifest中请求了如下功能:文档,图片,音乐,视频等,那么可以在库中枚举出这些文件.需要注意的是返回某个文件夹中的文件将根据manifest中声明的文件类型被自动过滤.
代码下载地址: