Save/create FileManager 将其视为文件的文件夹
Save/create folder that it to be treated as a file with FileManager
我有一个 iOS/CatalystMacOS-app 可以创建、保存、打开自定义文本文件(带有我自己的文件扩展名)。这很好用。但是,现在我需要的不仅仅是文字。我也想在此文件中保存可选文件。显然 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 取景器中查看时,它仍然被处理作为文件夹。此外,当尝试通过 UIDocumentPickerViewController 从打开对话框打开应用程序时,尝试打开文件包只会打开文件夹,不会让我将其打开到应用程序中:(
这是我的 info.list 导出类型 UTI:
Edit2: 也尝试删除除 com.apple.package 之外的所有内容,但也不起作用。仍然无法打开我的自定义类型,因为它的行为类似于文件夹。
成功了。似乎我的应用程序的旧版本正在干扰系统文件类型。所以我搜索了我的应用程序名称并从我的计算机中删除了旧版本。然后系统识别出我的文件后缀,马上打开!
但是这次我把图标弄丢了,但那是另一个问题:)
我有一个 iOS/CatalystMacOS-app 可以创建、保存、打开自定义文本文件(带有我自己的文件扩展名)。这很好用。但是,现在我需要的不仅仅是文字。我也想在此文件中保存可选文件。显然 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 取景器中查看时,它仍然被处理作为文件夹。此外,当尝试通过 UIDocumentPickerViewController 从打开对话框打开应用程序时,尝试打开文件包只会打开文件夹,不会让我将其打开到应用程序中:(
这是我的 info.list 导出类型 UTI:
Edit2: 也尝试删除除 com.apple.package 之外的所有内容,但也不起作用。仍然无法打开我的自定义类型,因为它的行为类似于文件夹。
成功了。似乎我的应用程序的旧版本正在干扰系统文件类型。所以我搜索了我的应用程序名称并从我的计算机中删除了旧版本。然后系统识别出我的文件后缀,马上打开!
但是这次我把图标弄丢了,但那是另一个问题:)