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。 当然,您会希望忽略某些文件和目录。

这都是相当简单的解析。