代码之家  ›  专栏  ›  技术社区  ›  JimmyJammed

iOS-使用NSURLSession和dataTaskWithRequest在给定url列出目录/文件?

  •  2
  • JimmyJammed  · 技术社区  · 9 年前

    我正在尝试通过NSURLSession连接到媒体服务器,并列出该url上的所有可用目录/文件 (即。 ftp://mediaServer.local ) ,然后遍历它们,直到找到要查找的文件。

    我可以使用“dataTaskWithRequest”提供一个url并吐出它的顶级文件/目录,但解析后的NSData并不真正可读,因此我可以将文件/目录附加到原始url,然后沿着路径遍历。

    以下是吐出的内容:

    Results: drwxrwsr-x   11 65534    65534       65536 Sep 19 15:36 Public
    

    然后我要遍历的目录是“Public”目录,因此接下来我要使用的url应该是 ftp://mediaServer.local/Public/ .

    如何解析NSData对象以更容易地获取所有可读文件/目录的实际名称? 我尝试将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()
    }
    

    更新:

    使用下面的答案,我尝试将每个文件/目录拆分为一个字符串,并将其拆分为一组数组,但它似乎无法正确地拆分组件,因为我只得到了具有完整文件路径字符串的单个项目数组。

    代码:

    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: [""]
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   zaph    9 年前

    结果只是一个文本目录列表,只是解析文本。您可以使用 componentsSeparatedByString:@"\n: 以获取条目数组。对于每个条目,您可以使用 componentsSeparatedByString:@" : (可能是@“\t”)以获取文件名。

    目录可由第一个字母“d”确定。

    当然,您需要忽略某些文件和目录。

    其他方法包括正则表达式和 NSScanner . 当然,您需要忽略某些文件和目录。

    这都是相当简单的解析。