可以使用传统的File.CreateText(路径)而不是IsolatedStorageFile吗?

时间:2014-10-22 21:50:22

标签: c# windows-phone-8 windows-phone-8.1

似乎每个人都假设你必须在Windows Phone 8上使用独立存储,但我还没有找到为什么。我还使用了一些我正在移植的代码,传统的File.CreateText(Windows.ApplicationModel.Package.Current.InstalledLocation)似乎工作正常。

所以在代码中,每个人似乎都在做this (from developer.nokia.com)

IsolatedStorageFile fileStorage = IsolatedStorageFile.GetUserStoreForApplication();
StreamWriter Writer = new StreamWriter(new IsolatedStorageFileStream("TestFile.txt", FileMode.OpenOrCreate, fileStorage));
Writer.WriteLine(textBox1.Text);
Writer.Close();

这实际上非常温顺。我看过太多的初学者教程使async成为现实,并且无法找出原因。但是,上面的代码在WP7上下文中提供。

<小时/> 更新:虽然以下代码在从Visual Studio运行时可用于WP8(HTC 8XT)和WP8.1(Lumia 640),但当我部署到商店时,它立即爆炸 试图保存到文件中。

<小时/> 以下代码似乎也可以正常工作,至少在WP模拟器,运行Windows Phone 8的HTC 8XT和运行WP 8.1的Lumia 640上。下面的代码可以在略微更好的背景at this link中看到,但这是重要的东西。是的,我正在使用一些匈牙利人。抱歉。显然,您的页面需要一个名为txtText的TextBox和一个名为strFileLoc的全局。

Windows.ApplicationModel.Package package =
    Windows.ApplicationModel.Package.Current;
Windows.Storage.StorageFolder installedLocation = 
    package.InstalledLocation;
this.strFileLoc = Path.Combine(installedLocation.Path, 
    "myFile.txt");

string strToWrite = this.txtText.Text;
using (StreamWriter sw = File.CreateText(this.strFileLoc))
{
    sw.WriteLine(strToWrite);
    sw.Close();
}

// Load
string strText = string.Empty;
if (File.Exists(this.strFileLoc))
{
    using (StreamReader sr = 
        new StreamReader(File.OpenRead(this.strFileLoc)))
    {
        strText = sr.ReadToEnd();
    }
}
else
{
    strText = "File doesn't exist";
}
this.txtText.Text = strText;

这可以在生产应用中使用吗?为什么或为什么不呢?

3 个答案:

答案 0 :(得分:1)

如果我没记错,在从Windows应用商店更新进度期间,文件将保持不变。至于你的另一个问题,这是你想要定位的平台问题(比如开发WP7-8.1 / WIN8 / WinRT的大多数事情)...参考这个MSDN论坛页面

Storage vs IsolatedStorage


从MSDN论坛复制

  

啊,ApplicationData vs IsolatedStorage。好吧,老实说,就性能而言,它们之间并没有很大的区别。它更多地是关于应用程序开发的选择。如果您正在为WP7.1和8编写,则必须使用IsolatedStorage作为ApplicationData.LocalFolder在7.x中不可用。如果要编写Win8 / WinRT和WinPhone中可用的代码,则必须使用ApplicationData,因为Windows 8不支持IsolatedStorage。两个API都是完全安全的,只能从创建的应用程序访问存储的数据它

     

因此,它归结为您希望使用代码的位置。如果您从头开始并且不关心WP7.x,我建议您使用ApplicationData,因为这是所有MS OS正在移动的方向。

     

如果这是答案,请将其标记为答案。

     

干杯,Mark B Schramm

答案 1 :(得分:1)

代码在调试时有效,因为基于VS的部署使您的应用程序可以对您的安装位置进行写入访问(一个烦人的错误/设计问题)。当您的应用程序从商店部署时,它没有安装位置的权限,并且会崩溃。解决方案是不要尝试在安装文件夹中创建(或写入)文件;请改用ApplicationData folders之一。

关于使用同步与异步方法,有两个答案。第一个答案是假设您正在从UI线程进行调用,异步方法允许您的UI保持响应,即使I / O需要很长时间(例如,从SD卡加载时可能会这样做)。依赖于同步API意味着您的UI可能会出现故障或看起来已经崩溃。

第二个答案是System.IO API对于Windows 8 / 8.1上的通用应用无效,因此如果您想重新使用代码,则别无选择,只能使用...Async WinRT蜜蜂。

从Windows 10 Universal应用程序开始,您可以在所有Windows设备系列中再次使用System.IO.File。由于您可以设置当前目录,可以执行以下操作:

Directory.SetCurrentDirectory(ApplicationData.Current.LocalFolder.Path);
using (var f = File.CreateText("hello.txt"))
{
  f.WriteLine("Hello, world");
}

请注意,当前目录是一个进程范围设置,所以一般来说避免使用这种代码(在不同的线程中将它设置为不同的值只会导致撕裂),但它很有用如果您有现有的代码依赖于相对路径。另请注意,理想情况下,您只能在后台线程中运行上述代码,因为它可能需要一些时间才能完成。

答案 2 :(得分:0)

我曾经在Windows Phone平台上工作,最具体地说,我拥有高质量的设备更新体验。用户数据,文件和设置将保留在更新的过程中,无论是在AppData还是隔离存储中。