Aci*_*onX 5 macos file-management swift swiftui
我正在编写一个额外的菜单栏,它会向您显示已安装的应用程序的列表,并允许您单击列表中的每个按钮来打开该应用程序。显然,要做到这一点,我需要用户拥有的每个应用程序的列表。我选择执行此操作的具体方法是创建一个函数,该函数将循环遍历系统的应用程序文件夹中的文件,删除应用程序内容中的任何内容或不以 .app 结尾的内容,并返回包含文件列表的数组作为名称,然后对其进行迭代以创建用户可以单击以启动应用程序的“应用程序按钮”列表。
我的函数的代码是
func enumerateAppsFolder() -> Array<String> {
var fileNames:Array<String> = []
let fileManager = FileManager.default
let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath:"/Applications/")!
while let element = enumerator.nextObject() as? String {
if element.hasSuffix("app") && !element.contains("Contents") { // checks the extension
fileNames.append(element)
}
}
return fileNames
}
Run Code Online (Sandbox Code Playgroud)
我创建我的列表
ForEach(enumerateAppsFolder(), id:\.self){
AppBarMenuItem(itemAppName: $0)
}
Run Code Online (Sandbox Code Playgroud)
但当我这样做时,结果是我所期望的,但表现却很糟糕。这可以在屏幕截图中看到,并且某些人的系统上较大的应用程序文件夹会使情况变得更糟
(当应用程序启动时,大约需要 5 分钟,CPU 和磁盘使用率也非常高)是否有更好更快的方法来检索系统上的每个应用程序,类似于 macOS 启动板或“Open With”。 。“ 列表?
enumerator您正在使用的方法执行FileManager文件树的深度枚举。您不需要深层枚举,只需要顶级枚举。enumerator使用具有options参数并传入的方法的版本.skipsSubdirectoryDescendants。
这是函数的更新版本,URL直接从FileManager应用程序文件夹获取,然后进行浅枚举以获取应用程序列表。
func enumerateAppsFolder() -> [String] {
var appNames = [String]()
let fileManager = FileManager.default
if let appsURL = fileManager.urls(for: .applicationDirectory, in: .localDomainMask).first {
if let enumerator = fileManager.enumerator(at: appsURL, includingPropertiesForKeys: nil, options: .skipsSubdirectoryDescendants) {
while let element = enumerator.nextObject() as? URL {
if element.pathExtension == "app" { // checks the extension
appNames.append(element.deletingPathExtension().lastPathComponent)
}
}
}
}
return appNames
}
print(enumerateAppsFolder())
Run Code Online (Sandbox Code Playgroud)
从 Swift Playground 运行时的示例输出:
“Numbers”、“Dropbox”、“Xcode”、“Apple Configurator 2”、“iMovie”
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |