为什么在使用 ios 模拟器时无法使用 contentsOfDirectory 提取文件 URL?

问题描述

我在尝试理解文件 url 访问如何在 swift 中工作时遇到问题。我知道 FileManager.default.urls(for: .documentDirectory,in: .userDomainMask) 总是为每个应用程序启动生成一个唯一的 url。 AFAIK 访问安全范围资源允许我访问该 url 中文件内容。但是,即使这样做之后,我也无法使用 contentsOfDirectory 返回文档目录中的任何文件。我试图通过尝试从我的 macbook 添加一些自定义文件来查看该目录是否为空,但一条错误消息指出同名文件已经存在。如果这些文件已经存在(顺便说一句,在每个唯一的 url 中),为什么它们的 url 不由 contentsOfDirectory 返回?有没有一种方法可以从 iphone 模拟器中提取一组文件 url,或者只是这种方法在模拟器中不起作用?

let document_files: [String] = ["/Users/james/Documents/Apple_Developer_Program_License_Agreement_XV2A27GUJ6.pdf","/Users/james/Documents/BH_US_11_Sullivan_Server_Side_WP.pdf","/Users/james/Documents/Classical and Quantum Singularities of Levi-Civita Spacetimes.pdf"]

let currentURL: URL = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first!

guard currentURL.startAccessingSecurityScopedResource() else {
    return nil
}

for document_file in document_files {
    do {
        try fileManager.copyItem(atPath: document_file,toPath: currentURL.path)
        //MARK: - When I do this,the system says the file already exists at FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first
    }
    catch {
        print(error)
    }
}

let files = try? fileManager.contentsOfDirectory(at: currentURL,includingPropertiesForKeys: [kcfURLNameKey as URLResourceKey],options: .includesDirectoriespostorder)
        //MARK: - But after this line,files array is still empty?
        //In the main app,fileExists was used on a new mac url created by combining the last component of user selection url with my custom mac url.

if files != nil {
    print("files is at least not nil.")
    if files!.count > 0 {
        //MARK: - This loop was thus never executed.
        for file in files! {
            print("File!")
            print(file)
            //Contents is my custom array.
            contents.append(file)
        }
    }
    else {
        print("However,files is empty.")
    }
}

解决方法

首先,您不能将 macOS 用户文档中的文件复制到您的应用程序文档目录中。第二个错误是您反复尝试用您的文件替换目录(您无法从 iOS 应用程序中读取)。您的文件在目标位置不存在,存在的是您的应用程序文档目录,您应该将文件名附加到目标目录 URL。 contentsOfDirectory 方法不返回任何文件,因为目录为空。另请注意,contentsOfDirectory 执行浅枚举,唯一受支持的选项是 skipsHiddenFiles。您不能手动将文件添加到您的应用程序文档目录,但您可以将它们包含在您的包中,并且在您的应用程序笑完之后,您可以将它们复制到那里。