iOS - 使用 NSURLSession 和 dataTaskWithRequest 在给定 url 列出 directories/files?
iOS - Listing directories/files at given url using NSURLSession and dataTaskWithRequest?
我正在尝试通过 NSURLSession 连接到媒体服务器并列出所有可用的 directories/files url (即ftp://mediaServer.local),然后向下遍历,直到找到我要找的文件。
我能够提供一个 url 并使用 'dataTaskWithRequest' 吐出它的顶级 files/directories,但是解析的 NSData 并不是真正可读的,所以我实际上可以附加 file/directory到原来的URL,然后沿着路径向下遍历。
下面是吐出来的内容:
Results: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
然后我要遍历的目录是'Public'目录,所以我接下来要使用的url应该是ftp://mediaServer.local/Public/.
如何解析 NSData 对象以便更轻松地获取所有可读对象的实际名称files/directories?
我尝试将 NSData 结果解析为 JSON 字典,但这不起作用。有什么建议吗?
这是我的代码:
// Url used = ftp://mediaServer.local/
func startRequestWithUrl(url: NSURL)
{
let request = NSURLRequest(URL: url)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
print("Data: \(data)")
print("Response: \(response)")
print("Error: \(error)")
if let data = data, let results = NSString(data: data, encoding: NSASCIIStringEncoding)
{
print("Results: \(results)")
do
{
let dict = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as? NSDictionary
print("Dict: \(dict)")
}
catch let caught as NSError
{
print("Caught: \(caught)")
}
catch
{
// Something else happened.
print("Error parsing data.")
}
}
}
task.resume()
}
更新:
根据下面的答案,我尝试将每个 file/directory 吐出到一个字符串中并将其分解成一个数组,但它似乎没有正确分解组件,因为我只得到一个 -仍然带有完整文件路径字符串的项目数组。
代码:
if let data = data, let results = NSString(data: data, encoding: NSASCIIStringEncoding)
{
print("Results: \(results)")
let lines = results.componentsSeparatedByString("\n")
for line in lines
{
let fields = line.componentsSeparatedByString("\t")
print("Line: \(line) - Fields: \(fields)")
}
}
结果:
Results: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
Line: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
- Fields: ["drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public\r"]
Line: - Fields: [""]
结果只是一个文本目录列表,只是解析文本。您可以使用 componentsSeparatedByString:@"\n:
获取条目数组。对于每个条目,您可以使用 componentsSeparatedByString:@" :
(可能是 @"\t")来获取文件名。
目录可以通过第一个字母来确定"d"。
您当然会想要忽略某些文件和目录。
其他方法包括正则表达式和NSScanner
。
当然,您会希望忽略某些文件和目录。
这都是相当简单的解析。
我正在尝试通过 NSURLSession 连接到媒体服务器并列出所有可用的 directories/files url (即ftp://mediaServer.local),然后向下遍历,直到找到我要找的文件。
我能够提供一个 url 并使用 'dataTaskWithRequest' 吐出它的顶级 files/directories,但是解析的 NSData 并不是真正可读的,所以我实际上可以附加 file/directory到原来的URL,然后沿着路径向下遍历。
下面是吐出来的内容:
Results: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
然后我要遍历的目录是'Public'目录,所以我接下来要使用的url应该是ftp://mediaServer.local/Public/.
如何解析 NSData 对象以便更轻松地获取所有可读对象的实际名称files/directories? 我尝试将 NSData 结果解析为 JSON 字典,但这不起作用。有什么建议吗?
这是我的代码:
// Url used = ftp://mediaServer.local/
func startRequestWithUrl(url: NSURL)
{
let request = NSURLRequest(URL: url)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
print("Data: \(data)")
print("Response: \(response)")
print("Error: \(error)")
if let data = data, let results = NSString(data: data, encoding: NSASCIIStringEncoding)
{
print("Results: \(results)")
do
{
let dict = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as? NSDictionary
print("Dict: \(dict)")
}
catch let caught as NSError
{
print("Caught: \(caught)")
}
catch
{
// Something else happened.
print("Error parsing data.")
}
}
}
task.resume()
}
更新:
根据下面的答案,我尝试将每个 file/directory 吐出到一个字符串中并将其分解成一个数组,但它似乎没有正确分解组件,因为我只得到一个 -仍然带有完整文件路径字符串的项目数组。
代码:
if let data = data, let results = NSString(data: data, encoding: NSASCIIStringEncoding)
{
print("Results: \(results)")
let lines = results.componentsSeparatedByString("\n")
for line in lines
{
let fields = line.componentsSeparatedByString("\t")
print("Line: \(line) - Fields: \(fields)")
}
}
结果:
Results: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
Line: drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public
- Fields: ["drwxrwsr-x 11 65534 65534 65536 Sep 19 15:36 Public\r"]
Line: - Fields: [""]
结果只是一个文本目录列表,只是解析文本。您可以使用 componentsSeparatedByString:@"\n:
获取条目数组。对于每个条目,您可以使用 componentsSeparatedByString:@" :
(可能是 @"\t")来获取文件名。
目录可以通过第一个字母来确定"d"。
您当然会想要忽略某些文件和目录。
其他方法包括正则表达式和NSScanner
。
当然,您会希望忽略某些文件和目录。
这都是相当简单的解析。