但是連apple自己的sample code都是用CFFTPStream(⋯⋯)
那⋯⋯只⋯⋯好⋯⋯自⋯⋯己⋯⋯來⋯⋯了(覺得很麻煩的語氣)
那⋯⋯只⋯⋯好⋯⋯自⋯⋯己⋯⋯來⋯⋯了(覺得很麻煩的語氣)
1、先弄出一個HTTP GET的範例,然把把網址改掉。
把HTTP改成FTP,server domin改成你要的ip
啊帳號密碼在哪設定? 通通塞在網址裡!
於是就成了這樣:
ftp://account:password@192.168.0.1/
(192.168.0.1是 FTP server IP)
(FTP server是開著的話把這串網址丟到瀏覽器上就能看到清單了)
-(void)connectFTP
{
NSString * ftpUrl = @"ftp://account:password@192.168.0.1/";
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *connTask = [session dataTaskWithURL:[NSURL URLWithString: ftpUrl] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString* resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"======resultStr=====\n%@",resultStr);
NSArray *separatedItems = [resultStr componentsSeparatedByString:@"\r\n"];
NSLog(@"======separatedItems=====\n%@",separatedItems);
}];
[connTask resume];//start with connect
}
2、有了網址就送一個封包出去,看看會拿到些什麼東西
把data轉成NSString,印出來
NSString* resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"======resultStr=====\n%@",resultStr);
總算get到清單啦
FTPDemo[83213:2017438]======resultStr=====
drwxrwxrwx folder 0 Dec 25 18:02 abc
-rw-rw-rw- 0 89460 89460 Nov 18 15:31 6196e48.jpg
drwxrwxrwx folder 0 Dec 24 12:29 Library
d(目錄)rwx rwx rwx(三種所有者存取權)0(不是資料夾)
89460(檔案位元數),folder(這是資料夾)
Dec 25 18:02(最後修改時間)
6196e48.jpg(文件名),abc(資料夾名)
一堆空白作為分隔,一行的結尾是\r\n
第二欄位的1不會顯示,what⋯⋯
哎上面那個是測試用的FTP server,這暫時不是我的重點。
今天需要用app從裝置上抓下FTP檔案到本機來,那就⋯⋯繼續
3、先把data string用換行切開來存成array:
NSArray *separatedItems = [resultStr componentsSeparatedByString:@"\r\n"];
然後分析字串。(眼神死)
這是這篇用的範例:
-rwxr-xr-x 1 0 0 7052920 Dec 25 15:58 ch_15122511.jpg
4、切開字串
今天還是用NSRegularExpression,詳情在這
app需要的重點只有後半段的檔案大小、時間、檔案名稱
至於3那邊多切出來的只有換行的index在這步驟裡會被過濾掉,不用擔心
主要是「\\s+」,不用擔心會有多出來的空格
(反正只要是多於一個的空格通通都在接收範圍內)
+ (NSMutableArray *)parseFTPstring:(NSArray*)ftpFileArray {
NSMutableArray * result = [[NSMutableArray alloc] init];
NSMutableDictionary * fileDictionary ;
for (NSString * string in ftpFileArray) {
NSString *pattern = @"([-rwx]+\\s+\\d\\s+\\d\\s+\\d\\s+)(\\d+) (\\w{3}\\s\\d{2}\\s\\d{2}:\\d{2}) (ch_[\\d]+\\.jpg)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (match != nil) {
fileDictionary = [[NSMutableDictionary alloc] init];
[fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:2]] forKey:@"fileSize"];
[fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:3]] forKey:@"fileDate"];
[fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:4]] forKey:@"fileName"];
[result addObject:fileDictionary];
NSLog(@"%@",fileDictionary);
}
}
return result;
}
[match rangeAtIndex:1]是權限跟三個布林值,沒有用所以不在code上
----
測一測發現裝置隔天FTP回傳格式居然變了
照理論來說,上次修改日期應該是年月日時分,時分跟年份在data中佔的是一樣的位置(⋯⋯)
-rwxr-xr-x 1 0 0 7980136 Dec 28 2015 ch_15122842.jpg----
測一測發現裝置隔天FTP回傳格式居然變了
照理論來說,上次修改日期應該是年月日時分,時分跟年份在data中佔的是一樣的位置(⋯⋯)
於是pattern改成了
NSString *pattern = @"([-rwx]+\\s+\\d\\s+\\d\\s+\\d\\s+)(\\d+) (\\w{3}\\s\\d{2}\\s+[\\d:]{3,5}) (ch_[\\d]+\\.jpg)";
這樣。(很想偷懶)因為每個參數都有空格隔開的緣故所以能這樣弄(笑
沒有留言:
張貼留言