使用 FileManager 保存/创建要作为文件处理的文件夹

Posted

技术标签:

【中文标题】使用 FileManager 保存/创建要作为文件处理的文件夹【英文标题】:Save/create folder that it to be treated as a file with FileManager 【发布时间】:2019-11-29 14:46:49 【问题描述】:

我有一个 ios/CatalystMacOS 应用程序,可以创建、保存、打开自定义文本文件(带有我自己的文件扩展名)。这工作正常。但是,现在我需要的不仅仅是文字。我也想在这个文件中保存可选文件。显然 macOS(和 iOS?)可以将文件夹视为文件。但我无法让它按要求工作。该文件夹仍被视为文件夹,即使它具有文件扩展名。

这是我用来创建文件夹的代码:

func showNewFilePathDialog(from viewController: UIViewController, saveCompleted: URLCallback?) 
    guard !isPresenting else 
        return
    
    let objectToSave = ...

    // Find an available filename
    var number = 0
    var exportURL: URL!
    var data: Data!
    var fullFileName = ""
    while true 
        let numberText = number == 0 ? "" : number.asString()
        fullFileName = "baseFileName" + "\(numberText).myFileExtension"
        exportURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fullFileName)

        let dict = objectToSave.toDict()
        let json = dict.json!
        data = json.data(using: .utf8)!

        if FileManager.default.fileExists(atPath: exportURL.path) 
            number += 1
            continue
         else 
            break
        
    

    do 
        try FileManager.default.createDirectory(atPath: exportURL.path, withIntermediateDirectories: true, attributes: nil)
     catch 
        NSLog("Couldn't create document directory")
        viewController.presentErrorDialog(from: error)
        return
    

    // 2. Create containing json file
    do 
        try data.write(to: exportURL.appendingPathComponent("content.json"))
     catch 
        viewController.presentErrorDialog(from: error)
        return
          
    isPresenting = true
    self.onSaveDialogComplete = saveCompleted
    let pickerViewController = UIDocumentPickerViewController(url: exportURL, in: .exportToService)
    pickerViewController.delegate = self
    viewController.present(pickerViewController, animated: true)

然后它在 macOS finder 中显示如下:

它会在 iOS 中显示类似,也不允许我将文件夹作为单个文件打开。

编辑: 使用 UIDocument/public.composite-content/FileWrapper 似乎也可以,但问题仍然存在:在 macOS finder 中查看时,它仍被视为文件夹。此外,当尝试通过 UIDocumentPickerViewController 从打开对话框打开应用程序时,尝试打开文件包只会打开文件夹,不会让我在应用程序中打开它:(

这是我的 info.list 导出类型 UTI:

Edit2: 还尝试删除除 com.apple.package 之外的所有内容,但也不起作用。仍然无法打开我的自定义类型,因为它的行为类似于文件夹。

【问题讨论】:

看起来你正在寻找一个叫做文档包的东西developer.apple.com/library/archive/documentation/…developer.apple.com/documentation/foundation/filewrapper 谢谢。但是,仍然无法正常工作。尝试:在文档类型中添加值为 YES 的 LSTypeIsPackage。还尝试将 com.apple.package 添加为“符合 UTI”,并尝试添加版本号 Filewrapper 和这个问题有什么关系? 我以为你需要那个developer.apple.com/documentation/foundation/filewrapper/… 谢谢。尝试 FileWrapper/UIDocument 打开/保存文件,但问题仍然相同。 macOS 和 iOS 都将文件视为文件夹,不允许我“作为文件”打开它 【参考方案1】:

搞定了。似乎我的应用程序的旧版本干扰了系统文件类型。所以我搜索了我的应用名称并从我的计算机中删除了旧版本。然后系统识别出我的文件后缀,马上打开!

但这次我丢失了图标,但这是另一个问题:)

【讨论】:

以上是关于使用 FileManager 保存/创建要作为文件处理的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Singleton在这种情况下是否合适?

iOS 文件操作:沙盒(SandBox)文件操作(FileManager)程序包(NSBundle)

swift 使用FileManager保存/检索数据

Filamanaging 仅限于 Cpanel Filemanager?

iOS - FileManager 扩展的最佳实践

Simogeo FileManager 不显示图像