2011-08-08 95 views
2

所以我寫這將需要從服務器應用程序(這也是我能控制的)通過套接字接收的文件結構的應用程序。我的客戶端是在Objective-C中,需要構建一個「File」對象的數組。我認爲遞歸會是一個好辦法,但我知道我的實現是不正確的。如何通過套接字發送一個文件層次

這裏是我的原創思維:

我打算使用語法來告訴客戶端節點是否有過任何兒童(如文件夾),或者是葉(例如文件)。我還想過爲最後一片葉子制定一個「lastleaf」語法來停止遞歸。語法是「type:path/to/file」。這裏是我想出了粗略的算法:

NSString* string = [self getStringFromSocket]; 
NSArray* split = [string componentsSeparatedByString:@":"]; 

if([@"lastleaf" isEqualToString:[split objectAtIndex:0]]) { 
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]]; 
    return [[NSMutableArray alloc] initWithObjects:newFile, nil]; 
} else if([@"leaf" isEqualToString:[split objectAtIndex:0]]) { 
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]]; 
    NSMutableArray* children = [[NSMutableArray alloc] initWithObjects:newFile, nil]; 
    [children addObjectsFromArray: [self getFiles]]; 
    return children; 
} else if([@"parent" isEqualToString:[split objectAtIndex:0]]) { 
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]]; 
    [newFile setSubfiles: [self getFiles]]; 
    return [[NSMutableArray alloc] initWithObjects:newFile, nil]; 
} 

}

我很高興的人忽略這一點,對付僞代碼,這只是我做事有缺陷的思考。

我將不勝感激任何建議或幫助。

編輯:我只是想看到的文件和它們的結構,而不是內容

回答

0

封裝文件系統結構的完美方法是使用嵌套NSDictionary對象:

  • 有沒有無限遞歸的機會,因爲有鍵值對數量有限的
  • 如果要爲文件添加屬性,可以使用<filename>_attr_readonly<filename>_isFolder等關鍵語法,或者甚至可以在自定義File對象(包含屬性等)上提供serializedeserialize函數,以將它們轉換爲NSString個S,並使用這些字符串作爲相應的值到文件名關鍵
  • 這些可以本地序列化爲plist文件,然後你的plist發送給客戶端(與壓縮,這將付出額外的好,原因內容僅是文本)

稍微清晰的:

NSDictionary (path: "/") 
| 
*-- key "myFile" -> value <MyFile> (path: "/myFile") 
| 
*-- key "myNestedFolder" -> value <NSDictionary> 
            | 
            *-- key "myNestedFile" -> value <MyFile> 
             (path "/myNestedFolder/myNestedFile") 
+0

我發現這種方式最容易實現,它很有意義。謝謝! – grat

0

的我把它送ZIP格式的路徑。照顧整個協議問題並增加壓縮。所有你需要的是一個合適的圖書館。

0

基本上,您應該利用現有的類或庫來操縱文件存檔。這將具有將文件層次結構捆綁在一起並將其解包所需的所有邏輯。檢查這個問題的更多信息Cocoa class for TAR archiving and unarchiving files

+0

請注意,我只是想送** **列表文件,而不是它們的內容。這個答案是否仍然適用?我已經更新了這個問題。 – grat