FileManager 找不到音频文件
FileManager cannot find audio file
您好!我的最终目标是使用 FileManager
遍历 /Documents/
目录并列出在那里找到的所有录音。UITableViewController
使用应用程序内制作的录音创建一个。
录制和回放都可以正常进行一次录制,设置如下:
// In VC#1
func setupRecorder(){
let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
} catch {
print("Audio Setup Error: \(error)")
}
do {
try audioSession.setActive(true)
} catch {
print("Audio Setup Error: \(error)")
}
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
audioFileName = "test.caf"
audioFileUrl = documentsDirectory.appendingPathComponent(audioFileName)
print("\n\nrecording url :\(audioFileUrl.absoluteString)\n\n")
let recordSettings = [
AVFormatIDKey: Int(kAudioFormatAppleLossless),
AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
AVEncoderBitRateKey : 320000,
AVNumberOfChannelsKey: 2,
AVSampleRateKey : 44100.0
] as [String : Any]
do {
audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: recordSettings)
} catch let error as NSError{
print("Audio Setup Error: \(error)")
audioRecorder = nil
}
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
}
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == GraphViewController.getEntrySegue() {
let navController = segue.destination as! UINavigationController
let destination = navController.topViewController as! GraphViewController
destination.audioFileName = audioFileName
destination.audioFileUrl = audioFileUrl
}
// In VC#2
func setupAudioPlayer() {
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
print(error)
}
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioFileUrl)
} catch {
print("Audio Player Setup Error: \(error)")
}
audioPlayer.prepareToPlay()
}
这一切都很好,花花公子;它可以毫无问题地播放录制的音频文件。但是,当我尝试通过 FileManager 查找文件时,FileManager 找不到它。下面列出了我尝试查找此文件的尝试。
print("\(FileManager.default.fileExists(atPath: audioFileUrl.absoluteString))") // -> False
print("\(FileManager.default.contents(atPath: audioFileUrl.absoluteString))") // -> nil
显然我一定遗漏了一些东西...特别是考虑到 AVAudioPlayer
成功读取了具有完全相同 url 的音频文件。路径打印为:
file:///var/mobile/Containers/Data/Application/1DA6BD0F-5A23-4228-92A9-A083E55ACE21/Documents/test.caf
有什么想法吗?
非常感谢!
编辑: 在将 url 存储为 属性 之前,我正在执行以下操作,重新计算 VC#2 中的文档目录然而也没有成功:
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = try? FileManager.default.contentsOfDirectory(atPath: documentsDirectory.absoluteString)
您不能保存沙盒文件 URL 或路径字符串供以后使用,因为沙盒可以移动。你需要做你之前做的事情,成功:计算文档目录 URL 然后检查它。你应该完全使用 URLs 而永远不要调用 absoluteString
;这完全是错误的决定,让你失望了。
在这个例子中,我检查文档目录中的任何文件:
let documentsDirectory =
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results =
try? FileManager.default.contentsOfDirectory(at: documentsDirectory,
includingPropertiesForKeys: nil)
您好!我的最终目标是使用 FileManager
遍历 /Documents/
目录并列出在那里找到的所有录音。UITableViewController
使用应用程序内制作的录音创建一个。
录制和回放都可以正常进行一次录制,设置如下:
// In VC#1
func setupRecorder(){
let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
} catch {
print("Audio Setup Error: \(error)")
}
do {
try audioSession.setActive(true)
} catch {
print("Audio Setup Error: \(error)")
}
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
audioFileName = "test.caf"
audioFileUrl = documentsDirectory.appendingPathComponent(audioFileName)
print("\n\nrecording url :\(audioFileUrl.absoluteString)\n\n")
let recordSettings = [
AVFormatIDKey: Int(kAudioFormatAppleLossless),
AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
AVEncoderBitRateKey : 320000,
AVNumberOfChannelsKey: 2,
AVSampleRateKey : 44100.0
] as [String : Any]
do {
audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: recordSettings)
} catch let error as NSError{
print("Audio Setup Error: \(error)")
audioRecorder = nil
}
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
}
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == GraphViewController.getEntrySegue() {
let navController = segue.destination as! UINavigationController
let destination = navController.topViewController as! GraphViewController
destination.audioFileName = audioFileName
destination.audioFileUrl = audioFileUrl
}
// In VC#2
func setupAudioPlayer() {
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
print(error)
}
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioFileUrl)
} catch {
print("Audio Player Setup Error: \(error)")
}
audioPlayer.prepareToPlay()
}
这一切都很好,花花公子;它可以毫无问题地播放录制的音频文件。但是,当我尝试通过 FileManager 查找文件时,FileManager 找不到它。下面列出了我尝试查找此文件的尝试。
print("\(FileManager.default.fileExists(atPath: audioFileUrl.absoluteString))") // -> False
print("\(FileManager.default.contents(atPath: audioFileUrl.absoluteString))") // -> nil
显然我一定遗漏了一些东西...特别是考虑到 AVAudioPlayer
成功读取了具有完全相同 url 的音频文件。路径打印为:
file:///var/mobile/Containers/Data/Application/1DA6BD0F-5A23-4228-92A9-A083E55ACE21/Documents/test.caf
有什么想法吗?
非常感谢!
编辑: 在将 url 存储为 属性 之前,我正在执行以下操作,重新计算 VC#2 中的文档目录然而也没有成功:
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = try? FileManager.default.contentsOfDirectory(atPath: documentsDirectory.absoluteString)
您不能保存沙盒文件 URL 或路径字符串供以后使用,因为沙盒可以移动。你需要做你之前做的事情,成功:计算文档目录 URL 然后检查它。你应该完全使用 URLs 而永远不要调用 absoluteString
;这完全是错误的决定,让你失望了。
在这个例子中,我检查文档目录中的任何文件:
let documentsDirectory =
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results =
try? FileManager.default.contentsOfDirectory(at: documentsDirectory,
includingPropertiesForKeys: nil)