如何解决如何在启用 App Sandbox 的情况下逐行读取文件?
我必须逐行读取一个文件,所以我确保我可以选择一个文件,然后通过传递路径调用一个函数来读取它。
但我收到以下错误:
An error took place: Error Domain=NSCocoaErrorDomain Code=260 "The file “30.160625.txt”
Couldn’t be opened because there is no such file."
UserInfo={NSFilePath=/Users/nameUser/Downloads/ask%20us/30.160625.txt,NSUnderlyingError=0x600002a68cc0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
我启用了应用沙盒,因为应用商店不接受禁用的应用。
有人可以帮我吗?
import SwiftUI
struct ContentView: View {
@State var path = "/Users/Documents"
func readFile(){
do {
let contentFromFile = try Nsstring(contentsOfFile: path,encoding: String.Encoding.utf8.rawValue)
print(contentFromFile)
}catch let error as NSError {
print("An error took place: \(error)")
}
}
var body: some View {
vstack{
TextField("Path",text: $path)
.padding(.vertical,8)
.padding(.horizontal,8)
.padding(.leading,22)
.padding(.trailing,22)
.cornerRadius(8)
.textFieldStyle(PlainTextFieldStyle())
.overlay(
HStack{
Button(action: {
let panel = NSOpenPanel()
let launcherLogPathWithTilde = path as Nsstring
let expandedLauncherLogPath = launcherLogPathWithTilde.expandingTildeInPath
panel.directoryURL = NSURL.fileURL(withPath: expandedLauncherLogPath,isDirectory: true)
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
if panel.runModal() == .OK {
self.path = panel.url?.absoluteString.replacingOccurrences(of: "file://",with: "") ?? "<none>"
readFile()
}
}){
Image(systemName: "folder.fill")
.frame(maxWidth: .infinity,alignment: .leading)
.foregroundColor(.gray)
.padding(.leading,8)
}
.buttonStyle(PlainButtonStyle())
}
)
}
.frame(width: 500,height: 200)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
编辑: 似乎有效,您觉得如何?
func readFile(){
let url = URL(fileURLWithPath: path)
do {
//var row: Subtitle = Subtitle()
var number: Int = 0
var start: String = ""
var end: String = ""
var text: String = ""
try String(contentsOf: url,encoding: .utf8)
.split(separator: "\n")
.forEach { line in
let n = Int(line)
if n != nil {
number = n!
} else if(line.contains("-->")){
print(line)
let matched = matches(for: "[0-9]+:[0-9]+:[0-9]+,[0-9]+",in: String(line))
print(matched)
start = matched[0]
end = matched[1]
//print("Time: \(line)")
} else {
text = String(line)
let row = Subtitle(number: number,start: start,end: end,text: text)
arrayS.append(row)
}
}
} catch let error as NSError {
print("An error took place: \(error)")
}
}
解决方法
不要使用在 SandBox 中不正确的硬编码路径,而是使用通过 NSFileManager
API 检索所需域的 URL(在您的情况下为用户)
/* -URLForDirectory:inDomain:appropriateForURL:create:error: is a URL-based replacement for FSFindFolder(). It allows for the specification and (optional) creation of a specific directory for a particular purpose (e.g. the replacement of a particular item on disk,or a particular Library directory.
You may pass only one of the values from the NSSearchPathDomainMask enumeration,and you may not pass NSAllDomainsMask.
*/
@available(iOS 4.0,*)
open func url(for directory: FileManager.SearchPathDirectory,in domain: FileManager.SearchPathDomainMask,appropriateFor url: URL?,create shouldCreate: Bool) throws -> URL
该 API 考虑了沙箱,并提供了有效的 URL,成对的 NSURL.startAccessingSecurityScopedResource
可用于读取相应的文件内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。