在Monotouch中向文件写入内容

35

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

这个文件应该在应用程序启动之间持久存在,因此我想它必须放置在应用程序包中的某个位置(文档或资源?)。

3个回答

106
[注意: 我的回答很详细,因为我不知道您对应用程序包或iPhone应用程序沙盒小世界的结构的理解程度 - 如果我涵盖了您已经知道的内容,请见谅 - 在讨论如何时,我更喜欢写得稍微多一点,并添加一些“为什么”...]

您有几个选项(当然)。我假设您已经在某种程度上熟悉 .Net,并且您的问题更多地是关于如何以iPhone方式执行此操作。

每个iPhone应用程序(您将在OS X上看到相同的内容)都是一个“bundle”,它不是传统意义上的可执行文件,而实际上是一个文件夹层次结构,其中包含您的应用程序二进制文件(以及资源、设置等)。

由于iPhone应用程序的超级沙盒,您无法访问通常在桌面开发中可以使用的共享文件夹(例如,位于用户主文件夹下的常用文档文件夹,应用程序可以访问该文件夹)。

相反,您的应用程序具有其自己的文件夹层次结构,就像其自己的一组通常在应用程序之间共享的文件夹。

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

〜/Library/Application Support/iPhone Simulator

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

对于要在应用程序会话之间保留的文件,您的应用程序文档文件夹是合适的位置。这不是创建文件的唯一选择,但这是此工作的正确选择。除了正确存储您的文件外,将它们保存在文档文件夹中还将使它们在用户同步时由iTunes备份。

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

如果您想测试它,这是一些极其简单的代码,将会在您应用程序的文档文件夹中写入一个名为"out.txt"的文件。此代码还读取文件内容以显示它已经被创建 - 为了进一步验证,去模拟器的应用程序文件夹,按修改日期对应用程序文件夹进行排序,深入到最近修改的文件夹,并查看其中的文档文件夹 - 您将找到"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);

因此,在这里唯一与iPhone有关的是要知道“Environment.SpecialFolder.Personal”映射到您应用程序的文档文件夹。除此之外,它就像往常一样使用 .Net。

而且,可能这有点过度,但我想为每个看到它的人充分回答。


2
罗瑞,罗瑞,罗瑞!解释得非常好。那绝对是完美无缺的!非常感谢! - Bryan
谢谢,我一直在努力解决这个问题,因为仿真器似乎使用了不同的写入权限。 - Ian Vink
3
阅读完答案后,我意识到它是在“09年回答的,而在'12年时仍然有用。这就是为什么我喜欢SO(Stack Overflow)。非常感谢Rory,它帮助我详细理解了问题。 - Subhash Dike
3
请记住,只有应用程序生成的内容应存储在“个人”文件夹中。可再生、可重复使用的跨会话内容应存储在“缓存”文件夹中,临时性的(可在会话之间丢弃)内容应存储在临时文件夹中。我的应用程序曾因将被苹果审核员视为非应用生成内容存储在“个人”文件夹中而被拒绝。 - Sorin Comanescu

13

8
您可以在运行时像这样做:
using (StreamWriter writer = new StreamWriter (Path.Combine (Environment.SpecialFolders.Documents, "yourfilename.ext"))) { }

这将会创建一个文件。要打开它以进行读取,请使用相同的Path.Combine(),但使用StreamReader


谢谢Gonzalo!我迫不及待想试试。 - Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接