C# 如何在Windows Phone 8上使用Windows.Storage正确读取和写入文件

C# 如何在Windows Phone 8上使用Windows.Storage正确读取和写入文件,c#,file-io,windows-runtime,windows-phone-8,C#,File Io,Windows Runtime,Windows Phone 8,我只需要在WindowsPhone8中使用Windows.Storage API简单地写入文件并读取文件。使用旧的IsolatedStorage方法相对容易,但使用新的WinRT API要困难得多 我一直想写它,但似乎有所有这些奇怪的东西像伊布弗。诸如此类。使用WinRT的完整版本,使用Windows.Storage.FileIO非常容易,它似乎可以让像我这样的开发人员远离疯狂。但是,它没有在手机版本中实现。此外,我观看了一段视频,其中显示了一些代码示例,但他们有一个错误,他们使用了标记为安全关

我只需要在WindowsPhone8中使用Windows.Storage API简单地写入文件并读取文件。使用旧的IsolatedStorage方法相对容易,但使用新的WinRT API要困难得多

我一直想写它,但似乎有所有这些奇怪的东西像伊布弗。诸如此类。使用WinRT的完整版本,使用Windows.Storage.FileIO非常容易,它似乎可以让像我这样的开发人员远离疯狂。但是,它没有在手机版本中实现。此外,我观看了一段视频,其中显示了一些代码示例,但他们有一个错误,他们使用了标记为安全关键的方法来获取常规流。显然,获取常规流是不允许的


那么,有没有人能给我提供一个简明而正确的代码片段,告诉我如何将文件读入字符串,以及如何将字符串写入文件,并提供正确的使用和处理技术

我还没有在Windows Phone 8上尝试过,但是WinRT XAML Toolkit在Windows 8上的功能是可行的



使用系统;
使用System.Threading.Tasks;
使用Windows.Storage;
使用Windows.Storage.Streams;
命名空间WinRTXamlToolkit.IO.Extensions
{
/// 
///扩展,用于简单地向文件中写入和读取字符串。
/// 
/// 
///请注意,这些是在WinRT中存在FileIO类之前创建的,但它们仍然有其用途。
/// 
公共静态类StringIOExtensions
{
/// 
///从文本文件中读取字符串。
/// 
///文件名。
///文件夹。
/// 
公共静态异步任务ReadFromFile(
字符串文件名,
StorageFolder文件夹=空)
{
folder=文件夹??ApplicationData.Current.LocalFolder;
var file=await folder.GetFileAsync(文件名);
使用(var fs=await file.OpenAsync(FileAccessMode.Read))
{
使用(var inStream=fs.GetInputStreamAt(0))
{
使用(变量读取器=新数据读取器(流内))
{
wait reader.LoadAsync((uint)fs.Size);
字符串数据=reader.ReadString((uint)fs.Size);
reader.DetachStream();
返回数据;
}
}
}
}
/// 
///将字符串写入文本文件。
/// 
///要写的文本。
///文件名。
///文件夹。
/// 
///确定文件名是否相同时如何响应的枚举值
///作为当前文件夹中现有文件的名称。默认为ReplaceExisting。
/// 
/// 
公共静态异步任务WriteToFile(
这个字符串是文本,
字符串文件名,
StorageFolder文件夹=null,
CreationCollisionOption选项=CreationCollisionOption.ReplaceExisting)
{
folder=文件夹??ApplicationData.Current.LocalFolder;
var file=await folder.CreateFileAsync(
文件名,
选择权);
使用(var fs=await file.OpenAsync(FileAccessMode.ReadWrite))
{
使用(var outStream=fs.GetOutputStreamAt(0))
{
使用(var dataWriter=newdatawriter(扩展))
{
如果(文本!=null)
dataWriter.WriteString(文本);
等待dataWriter.StoreAsync();
dataWriter.DetachStream();
}
等待流出。FlushAsync();
}
}
}
}
}

以下是一个简单的示例:

public async Task WriteDataToFileAsync(string fileName, string content)
{
    byte[] data = Encoding.Unicode.GetBytes(content);

    var folder = ApplicationData.Current.LocalFolder;
    var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

    using (var s = await file.OpenStreamForWriteAsync())
    {
        await s.WriteAsync(data, 0, data.Length);
    }
}

public async Task<string> ReadFileContentsAsync(string fileName)
{
    var folder = ApplicationData.Current.LocalFolder;

    try
    {
        var file = await folder.OpenStreamForReadAsync(fileName);

        using (var streamReader = new StreamReader(file))
        {
            return streamReader.ReadToEnd();
        }
    }
    catch (Exception)
    {
        return string.Empty;
    }
}

根据你想做什么,看一看。如果它解决了您的问题,您可以使用它,或者查看源代码以了解它们是如何解决这些问题的。@vcsjones记住一件好事,但我们不能包含任何依赖项:(此外,它在WP8上使用了IsolatedStorage。该项目为带有可移植类库的I/O操作提供了一个通用接口。这可能会给您一些提示吗?使用(StreamReader sr=new StreamReader(File.OpenRead(strFileLoc))有什么原因吗…样式代码对您不起作用?我有一个标准的文件写入方法。有两个问题:1.您应该在write方法上返回任务,所以这是可以等待的。2.看起来您正在编写UTF8并读回UTF16,或者StreamReader足够聪明,可以在不被告知的情况下告诉编码吗?@paulannett很好spots.将教我如何从随机的internet源复制和粘贴;)另外,使用
OpenStreamForReadAsync
是安全的CRITICAL@Earlz我可以问一下为什么
OpenStreamForReadAsync
是安全关键的吗?微软在那里使用的是示例代码()看来我们应该使用这些。@StefanWexel是的,结果并不重要。我现在甚至不明白安全关键是什么意思,但我从非安全关键代码调用安全关键函数时没有收到任何认证错误。所以我想这一切都很好。这比“简单示例”更有效。可能是因为这段代码使用了FlushAsync之类的方法进行了清理。我使用的是VS2013更新2,这方面的情况发生了很大变化!
public async Task WriteDataToFileAsync(string fileName, string content)
{
    byte[] data = Encoding.Unicode.GetBytes(content);

    var folder = ApplicationData.Current.LocalFolder;
    var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

    using (var s = await file.OpenStreamForWriteAsync())
    {
        await s.WriteAsync(data, 0, data.Length);
    }
}

public async Task<string> ReadFileContentsAsync(string fileName)
{
    var folder = ApplicationData.Current.LocalFolder;

    try
    {
        var file = await folder.OpenStreamForReadAsync(fileName);

        using (var streamReader = new StreamReader(file))
        {
            return streamReader.ReadToEnd();
        }
    }
    catch (Exception)
    {
        return string.Empty;
    }
}
await this.WriteDataToFileAsync("afile.txt", "some text to save in a file");

var contents = await this.ReadFileContentsAsync("afile.txt");