【问题标题】:Can conventional File.CreateText(path) be used instead of IsolatedStorageFile?可以使用常规 File.CreateText(path) 来代替 IsolatedStorageFile 吗?
【发布时间】:2014-10-22 21:50:21
【问题描述】:

似乎每个人都认为您必须在 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;

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

【问题讨论】:

  • 我知道。责备this guy 来自,拍摄,15 多年前。这是一个诅咒。 ;^) 至少它是一个示例应用程序。真正的代码有像this.txtPrice.Text 这样可怕的东西。 /sigh 我只为个人项目做,我发誓!

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 所以如果我换成ApplicationData.Current.LocalFolder.Path,应该没问题吧?大多数教程是否有任何理由要改为写入和读取文件with async methods?谢谢!
  • “炸毁”是什么意思?您可以发布正在爆炸的代码吗?请注意,您不能在 Windows [Phone] 8.x 应用程序中使用 System.IO API。
  • 看起来我把包上传搞砸了——昨晚又试了很多(所以几乎足够)调试代码,一切正常,没有[可操作] 变化。再次感谢,并为红鲱鱼道歉。应用商店中还有一款应用!
【解决方案2】:

如果我没记错的话,在 Windows 应用商店的更新过程中文件是单独存在的。至于您的其他问题,这是您希望针对的平台的问题(例如与为 WP7-8.1/WIN8/WinRT 开发相关的大多数事情)...请参阅此 MSDN 论坛页面

Storage vs IsolatedStorage


复制自 MSDN 论坛

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

所以它归结为你想在哪里使用你的代码。如果您从头开始并且不关心 WP7.x,我建议您使用 ApplicationData,因为这是所有 MS 操作系统正在发展的方向。

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

干杯,马克 B 施拉姆

【讨论】:

  • 有趣。那么我在使用“ApplicationData”吗?也就是说,我的代码中的Windows.ApplicationModel.Package.Current.InstalledLocation 是否与ApplicationData.LocalFolder 相关?无论哪种方式,使用LocalFolder 是否有优势?也许最重要的是,你是说我的代码不会在 WP7 上工作吗?我没有为 7 设置开发环境,但如果是这样的话,我认为这个谜团已经解决了。
  • Fwiw,刚刚在商店中临时发布了一个应用程序,我的常规写入炸毁了该应用程序。在设备调试模式下的 [n 实际] Windows Phone 上运行良好,但从商店下载后,BLAM。
【解决方案3】:

我曾经在 Windows Phone 平台上工作,尤其是我拥有优质的设备更新体验。用户数据、文件和设置都保留在更新过程中,无论是在 AppData 还是独立存储中。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 2021-08-25
    • 2016-04-05
    • 2015-05-09
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2012-08-11
    相关资源
    最近更新 更多