如何从 swift 中的文档目录获取特定文件的 NSURL
How to get NSURL on specific file from document directory in swift
我在 NSFileManager
的帮助下从文档目录获取文件。我得到了一组文件名,我可以将它们传递给另一个控制器。当我传递这些文件的名称时,我仍然想从我的 UITableViewCell
传递特定文件的 NSURL
。我的文件是mp3。请帮助我。
var listOfMP3Files: Array<String!>? // for Cell data
func fetchFilesFromFolder() {
var fileManager = NSFileManager.defaultManager()
var folderPathURL = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)[0] as! NSURL
var documentsContent = fileManager.contentsOfDirectoryAtPath(folderPathURL.path!, error: nil)
println(documentsContent)
if var directoryURLs = fileManager.contentsOfDirectoryAtURL(folderPathURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil) {
println(directoryURLs)
var mp3Files = directoryURLs.map(){ [=11=].lastPathComponent }.filter(){ [=11=].pathExtension == "mp3" }
listOfMP3Files = mp3Files
println(mp3Files)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! AVPlayerVC
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
if segue.identifier == "listenMusic" {
playerVC.object = objectForPass
}
}
更新:
我更新了我的代码,我可以获取jpg类型的文件。但是我不知道如何获取mp3文件。
我更新的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!)
if segue.identifier == "listenMusic" {
playerVC.musicFile = objectForPass
playerVC.end = image
}
}
更新2
我编辑了我的代码,我可以在 mp3 文件上传递 NSURL
,在另一个 UIViewController
中我可以播放它们。
下面是修改后的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
/* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!) */
//
var fileM = NSFileManager.defaultManager()
var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var passMusicFileURL: NSURL?
if let documentPath: NSURL = wayToFile.first as? NSURL {
let musicFile = documentPath.URLByAppendingPathComponent(objectForPass)
println(musicFile)
passMusicFileURL = musicFile
}
if segue.identifier == "listenMusic" {
// playerVC.musicFile = objectForPass
playerVC.end = passMusicFileURL
}
}
在单独的中间语句中创建完整文件URL,您会发现问题所在。
如果没有独立的语句调试是非常困难的。
folderPathURL.path
不正确。
首先创建整个文件路径,然后从中创建 f 文件 URL。
示例:
let name = "aFileName"
var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
println("\nfilePath: \(filePath)")
filePath = filePath.stringByAppendingPathComponent(name)
println("\nfilePath: \(filePath)")
var filePathURL = NSURL.fileURLWithPath(filePath)
println("\nfilePathURL: \(filePathURL!)")
输出:
filePath: /Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents
filePath: /Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents/aFileName
filePathURL: file:///Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents/aFileName
使用中间语句可以验证每个步骤。
我找到了我的问题的解决方案
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
/* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!) */
//
var fileM = NSFileManager.defaultManager()
var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var passMusicFileURL: NSURL?
if let documentPath: NSURL = wayToFile.first as? NSURL {
let musicFile = documentPath.URLByAppendingPathComponent(objectForPass)
println(musicFile)
passMusicFileURL = musicFile
}
if segue.identifier == "listenMusic" {
// playerVC.musicFile = objectForPass
playerVC.end = passMusicFileURL
}
}
我在 NSFileManager
的帮助下从文档目录获取文件。我得到了一组文件名,我可以将它们传递给另一个控制器。当我传递这些文件的名称时,我仍然想从我的 UITableViewCell
传递特定文件的 NSURL
。我的文件是mp3。请帮助我。
var listOfMP3Files: Array<String!>? // for Cell data
func fetchFilesFromFolder() {
var fileManager = NSFileManager.defaultManager()
var folderPathURL = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)[0] as! NSURL
var documentsContent = fileManager.contentsOfDirectoryAtPath(folderPathURL.path!, error: nil)
println(documentsContent)
if var directoryURLs = fileManager.contentsOfDirectoryAtURL(folderPathURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil) {
println(directoryURLs)
var mp3Files = directoryURLs.map(){ [=11=].lastPathComponent }.filter(){ [=11=].pathExtension == "mp3" }
listOfMP3Files = mp3Files
println(mp3Files)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! AVPlayerVC
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
if segue.identifier == "listenMusic" {
playerVC.object = objectForPass
}
}
更新:
我更新了我的代码,我可以获取jpg类型的文件。但是我不知道如何获取mp3文件。
我更新的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!)
if segue.identifier == "listenMusic" {
playerVC.musicFile = objectForPass
playerVC.end = image
}
}
更新2
我编辑了我的代码,我可以在 mp3 文件上传递 NSURL
,在另一个 UIViewController
中我可以播放它们。
下面是修改后的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
/* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!) */
//
var fileM = NSFileManager.defaultManager()
var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var passMusicFileURL: NSURL?
if let documentPath: NSURL = wayToFile.first as? NSURL {
let musicFile = documentPath.URLByAppendingPathComponent(objectForPass)
println(musicFile)
passMusicFileURL = musicFile
}
if segue.identifier == "listenMusic" {
// playerVC.musicFile = objectForPass
playerVC.end = passMusicFileURL
}
}
在单独的中间语句中创建完整文件URL,您会发现问题所在。
如果没有独立的语句调试是非常困难的。
folderPathURL.path
不正确。
首先创建整个文件路径,然后从中创建 f 文件 URL。
示例:
let name = "aFileName"
var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
println("\nfilePath: \(filePath)")
filePath = filePath.stringByAppendingPathComponent(name)
println("\nfilePath: \(filePath)")
var filePathURL = NSURL.fileURLWithPath(filePath)
println("\nfilePathURL: \(filePathURL!)")
输出:
filePath: /Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents
filePath: /Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents/aFileName
filePathURL: file:///Users/zaph/Library/Developer/CoreSimulator/Devices/264B31F6-3A28-4C75-9205-3558BBF54DED/data/Containers/Data/Application/0048403F-C8DE-4EE7-83CF-6AE7CCBAF090/Documents/aFileName
使用中间语句可以验证每个步骤。
我找到了我的问题的解决方案
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController
var indexPath = tableView.indexPathForSelectedRow()
var objectForPass = listOfMP3Files![indexPath!.row] // default
//
/* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String
var getImage = path?.stringByAppendingPathComponent(objectForPass)
var image = UIImage(contentsOfFile: getImage!) */
//
var fileM = NSFileManager.defaultManager()
var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
var passMusicFileURL: NSURL?
if let documentPath: NSURL = wayToFile.first as? NSURL {
let musicFile = documentPath.URLByAppendingPathComponent(objectForPass)
println(musicFile)
passMusicFileURL = musicFile
}
if segue.identifier == "listenMusic" {
// playerVC.musicFile = objectForPass
playerVC.end = passMusicFileURL
}
}