周三常见问题解答:子文件夹和文件访问

周三常见问题解答:子文件夹和文件访问

常见问题图标现在是星期三,又到了解答常见问题 (FAQ) 的时间。这里有一些关于访问子文件夹和文件的常见问题解答。

1. 如何在“文档”或“临时”目录中创建一个新的子文件夹?

可以使用 Lua 文件系统 (LFS) 将子文件夹添加到目录。资源目录是只读的,无法修改。

以下是如何在“文档”目录中创建一个 Images 文件夹。

您可以在此处找到有关 LFS 的更多信息。

2. 如何访问(读取或写入)已放置在子文件夹中的文件?

您可以根据您想要对文件执行的操作,通过两种方式访问子文件夹中的文件。如果您想显示图像或播放文件中的声音,您可以将子文件夹名称与文件名连接起来,然后提供基本目录。例如,如果您想在“文档”目录中的 Images 子文件夹中显示 cat.png 文件,请执行以下操作

请注意,在需要 baseDirectory 参数的 API 调用中(例如,display.newImage、display.newImageRect、audio.loadSound 等),您不使用 system.pathForFile

如果您想在同一个目录中打开 readme.txt 文件,请使用 system.pathForFile 执行以下操作

如果文件存在,则 fileHandle 将不会是 nil,这将引出我们的下一个问题。

3. 如何测试文件是否存在于文件夹或子文件夹中?

您可以从代码中调用以下函数,以查看文件是否存在于文件夹或子文件夹中。只需记住在调用此函数之前将子文件夹名称附加到文件名。

以下是如何调用上述函数。

4. 如何将文件复制到子文件夹?

以下函数允许将文件从一个文件夹复制到另一个文件夹。一个常见的用法是将 Resource 目录中包含的文件复制到 Documents 目录。在使用此函数之前,必须创建任何子文件夹(如果它们不存在)。

以下是如何使用复制文件例程将 readme.txt 文件从 Resource 目录复制到 Documents 目录。

5. 关于文件,Android 有哪些限制?

Corona 中的文件访问基于底层操作系统,它会因平台而异。在 iOS 设备上,可以访问 Resource 目录(main.lua 所在的位置)以及 Documents 和 Temporary 目录中的文件。在 Android 上,访问 Resource 目录是有限的,因为它不是真实的目录,而是文件包含在一个 zip 文件中。Corona 允许使用 audio 和 image API 直接加载图像和音频文件,但使用文件 I/O API 对 Resource 文件的访问有限。

由于在 Android 上的这种限制,如果 Resource 目录中包含想要复制到另一个目录(例如 Documents)的文件,则需要更改资源目录中的文件名,以便可以通过文件 I/O API 访问它。例如,如果想将图像文件从 Resource 移动到 Documents 目录,则必须使用不同的扩展名重命名它,以便可以访问它。我们的 cat.png 文件需要被命名为 cat.png.txt 才能被复制。

以下是在 Android 上将 cat.png 文件复制到 Documents 目录的方法(假设它存储为 cat.png.txt)。

在 Android 的 Resource 目录中无法读取的文件扩展名有:html、htm、3gp、m4v、mp4、png、jpg 和 rtf。

上述技术适用于所有平台,所以如果它在 Android 上有效,那么在其他任何地方都有效。

这就是今天的常见问题解答。我希望你们喜欢它们,甚至学到了一些东西。

tom
4 条评论
  • Jose
    发布于 09:27, 2 月 14 日

    好文章,Tom! 我是从论坛上关于 pathForFile 警告的问题来到这里的 (http://developer.coronalabs.com/forum/2013/02/14/pathforfile-warnings),但我恐怕你的代码也存在同样的问题。
    有没有其他方法可以获取文件的存在状态,而跳过 pathForFile 在找不到文件时引起的警告???
    无论如何,第 1 点和第 4 点对我的下一个项目非常有帮助,谢谢!

  • Alberto
    发布于 09:38, 2 月 15 日

    你好!

    关于 Android 设备,是否可以创建子文件夹并将文件复制到外部存储?

    我的 Android 设备有 2GB 的内部存储和 16GB 的 NAND 闪存。
    我正在开发的应用程序允许用户下载大约 1GB 大小的目录,所以我需要使用闪存中的 16GB。
    这可能吗?

    先感谢了!

    Alberto。

  • Alberto
    发布于 01:14, 2 月 19 日

    另一个问题
    我在 system.DocumentsDirectory 中创建了一个子目录,并且我想将文件直接下载到我创建的那个子文件夹中。当我尝试提供 system 基本目录之外的路径时,它会忽略它们并恢复为 system.DocumentsDirectory 的默认值,尽管添加了子目录名称。

    是否无法直接下载到我刚刚创建的子文件夹中?

    Alberto。

  • lessmsios
    发布于 17:36, 4 月 1 日

    在 copy 函数中,行

    local srcPath = doesFileExist( srcName, srcPath )

    会覆盖参数 srcPath。如果你在不重命名该测试的情况下按原样使用此函数,它会抛出错误。