写入Monotouch中的文件

Bry*_*yan 35 .net c# iphone xamarin.ios

如何在Monotouch iPhone应用程序中创建和写入文件?

该文件应该在应用程序启动之间保持不变,所以我想它必须放在App包中的某个位置(文档或资源?).

Ror*_*yth 106

[ 注意:我的回答非常彻底,因为我不知道你对应用程序包的理解程度或你的iPhone应用程序的沙盒小世界的结构 - 如果我涵盖你已经知道的事情,我会道歉 - 我更喜欢写一些比太少了,并在讨论如何 ... 时添加一些原因

你有几个选择(当然).我假设你已经在某种程度上熟悉了.Net,你的问题更多的是关于如何通过iPhone方式做到这一点.

每个iPhone应用程序(你会在OS X上看到相同的东西)是一个"捆绑",它不是传统意义上的可执行文件,但实际上是你的应用程序二进制文件所在的文件夹层次结构(以及资源​​) ,设置等).

由于iPhone应用程序是如何使用超级沙盒的,因此您无法访问在进行桌面开发时通常可以使用的共享文件夹(例如,具有位于用户主文件夹下的公共文档文件夹)哪些应用程序可以访问).

相反,您的应用程序有自己的文件夹层次结构,就像它自己的个人文件夹集一样,通常会在应用程序之间共享.

在手机上查看应用程序文件夹结构的最简单方法是查看iPhone模拟器用于应用程序安装,设置,等等等等的文件夹.在我的机器上(我不记得这是否可配置,但在您的系统上可能是相同的),您可以通过此路径访问该文件夹:

~/Library/Application Support/iPhone Simulator

在其中,有一个User/Applications文件夹,其中包含您已安装到模拟器的应用程序.深入查看其中任何一个文件夹,您可以看到应用程序可以在手机上访问的文件夹结构.

要存储您希望在应用会话中保留的文件,应用程序的Documents文件夹就是最佳位置.它不是您创建文件的唯一选择,但它是这项工作的正确选择.除了正确存储文件之外,当用户同步时,将它们保存在Documents文件夹中也会使iTunes备份它们.

使用MonoTouch,您可以获取应用程序的Documents文件夹路径 Environment.GetFolderPath(Environment.SpecialFolder.Personal);

如果您想测试它,这是一个非常简单的代码,它会将名为"out.txt"的文件写入应用程序的Documents文件夹.此代码还会读取文件的内容以显示它已创建 - 要进一步验证,请转到模拟器的"应用程序"文件夹,按照修改日期对应用程序文件夹进行排序,深入查看最近修改过的文件夹,然后查看其文档内部文件夹 - 您将找到"out.txt"(您无法按名称找到您的应用程序的文件夹,因为当您的应用程序安装完成后,它会被填充到名称为"2B3CA854-FADB-4DDC-9732-0E61B3DD8D8C"的文件夹中" - 按修改日期对文件夹进行排序将指向最近修改过的应用程序,在这种情况下,应用程序包含以下代码:

// For this to function, don't forget "using System.IO;"

// If you're just playing around with this to see it work, place it inside
// your AppDelegate's "FinishedLaunching" method in main.cs

string path = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
string filePath = Path.Combine(path, "out.txt");

// File.WriteAllText will create a file and then write text to it. If the
// file already exists, File.WriteAllText will overwrite it.
File.WriteAllText(filePath, "Howdy, world.");

// Now we prove it worked by reading the contents of the file and then
// printing them to the console...   
string text = File.ReadAllText(filePath);
Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)

所以,这里唯一真正针对iPhone的是知道"Environment.SpecialFolder.Personal"映射到你应用的Documents文件夹.除此之外,它像往常一样.Net.

而且,再次,这可能是矫枉过正,但我​​想彻底回答所有看到它的人 - 希望这有帮助:)

  • 在阅读完答案之后,我意识到它在09年得到了回应,而在'12,它仍然有用.这就是我喜欢的原因..非常感谢Rory,它有助于详细了解. (3认同)
  • 请记住,只有应用程序生成的内容应存储在Personal文件夹中.跨会话内容的可再生,可重用的应存储在Cache文件夹中,并临时(在会话之间可丢弃)的内容存储在临时文件夹中.我有可能应用程序被拒绝一次存储在Apple评论员认为不是由应用程序生成的个人文件夹内容中. (3认同)
  • 罗里罗里罗里!很棒的解释.那绝对是完美的!非常感谢! (2认同)

mig*_*aza 13

以下"如何从Xamarin.iOS指南"网站提供了一些指向文件存储位置的指示:

http://docs.xamarin.com/guides/ios/application_fundamentals/working_with_the_file_system/


Gon*_*alo 8

您可以在运行时执行以下操作:

using (StreamWriter writer = new StreamWriter (Path.Combine (Environment.SpecialFolders.Documents, "yourfilename.ext"))) { }
Run Code Online (Sandbox Code Playgroud)

这将创建该文件.要打开它进行阅读,请使用Path.Combine()StreamReader相同的内容.