2011-12-04 33 views
53

Tôi đã thiết lập đoạn mã sau để lưu một tập tin vào thư mục tài liệu:Liệt kê các tệp đã lưu trong thư mục tài liệu iOS trong UITableView?

NSLog(@"Saving File..."); 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.reddexuk.com/logo.png"]]; 
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"logo.png"]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Successfully downloaded file to %@", path); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

[operation start]; 

Tuy nhiên, tôi muốn thêm từng tập tin vào một UITableView khi nó được lưu thành công. Khi tệp trong UITableView được khai thác, tôi muốn một UIWebView điều hướng đến tệp đó (tất cả ngoại tuyến).

Ngoài ra - làm cách nào tôi có thể lấy tên tệp và kết thúc như "logo.png" thay vì http://www.reddexuk.com/logo.png?

Tôi làm cách nào để thực hiện việc này?

Trả lời

138

Đây là phương pháp tôi sử dụng để lấy nội dung của một thư mục.

-(NSArray *)listFileAtPath:(NSString *)path 
{ 
    //-----> LIST ALL FILES <-----// 
    NSLog(@"LISTING ALL FILES FOUND"); 

    int count; 

    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; 
    for (count = 0; count < (int)[directoryContent count]; count++) 
    { 
     NSLog(@"File %d: %@", (count + 1), [directoryContent objectAtIndex:count]); 
    } 
    return directoryContent; 
} 
+0

cảm ơn, nhưng làm cách nào để đưa dữ liệu này vào UITableView và sau đó mở tệp trong UIWebView? – pixelbitlabs

+1

Đây là hướng dẫn [UITableView] (http://www.iosdevnotes.com/2011/10/uitableview-tutorial/) tốt và đây là liên kết tới [dự án xcode] (https://github.com/cwalcott)/UITableView-Tutorial) cho hướng dẫn này. Đây là một hướng dẫn tốt về [UIWebView] (http://www.iphonesdkarticles.com/2008/08/uiwebview-tutorial.html) – syclonefx

+0

Cảm ơn vì điều đó. Tôi biết làm thế nào để tạo ra một UITableView vv nhưng không chắc chắn làm thế nào để có được các tập tin thực sự vào UITableView chính nó. Trang web bạn đã gửi không thực sự đề cập đến: ( – pixelbitlabs

11

Để có được nội dung của một thư mục

- (NSArray *)ls { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory]; 

    NSLog(@"%@", documentsDirectory); 
    return directoryContent; 
} 

Để có được thành phần đường dẫn cuối cùng,

[[path pathComponents] lastObject] 
+0

cảm ơn, nhưng làm cách nào để đưa dữ liệu này vào UITableView và sau đó mở tệp trong UIWebView? Ngoài ra, "[[path pathComponents] lastObject]" sẽ không nhận được tên tệp đầy đủ chỉ là loại tệp (ví dụ: ".gif" không phải "test.gif") vì vậy tôi có thể làm gì để có được "test.gif"? – pixelbitlabs

+2

Tôi khuyên bạn nên đọc trên UITableViews. Một hướng dẫn đầy đủ chiều dài không thực sự xảy ra trên Stack Overflow – coneybeare

+0

nhưng @coneybeare - bạn không đề cập đến bất cứ điều gì để trả lời nhận xét về các loại tệp. Tôi cũng muốn làm điều này. Bạn có thể chỉ cho tôi đúng hướng không? – pixelbitlabs

19
-(NSArray *)findFiles:(NSString *)extension{ 

NSMutableArray *matches = [[NSMutableArray alloc]init]; 
NSFileManager *fManager = [NSFileManager defaultManager]; 
NSString *item; 
NSArray *contents = [fManager contentsOfDirectoryAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] error:nil]; 

// >>> this section here adds all files with the chosen extension to an array 
for (item in contents){ 
    if ([[item pathExtension] isEqualToString:extension]) { 
     [matches addObject:item]; 
    } 
} 
return matches; } 

Ví dụ trên là khá tự giải thích. Tôi hy vọng nó sẽ trả lời cho bạn câu hỏi thứ hai.

+0

Cảm ơn nhưng đó không phải là những gì tôi đã thực sự yêu cầu. Tôi không muốn tìm thấy nhiều tên tập tin, tôi chỉ muốn cắt ra http://www.domain.com/ vì vậy tôi là trái với bit "file.suffix" ở cuối. Chắc chắn có một cách nhanh hơn để làm điều đó? – pixelbitlabs

+0

@ Mike Martin câu trả lời của bạn đã cho tôi một ý tưởng để giải quyết vấn đề mà tôi đang phải đối mặt ngay bây giờ. Cảm ơn bạn. P.S. Chỉ một điều nữa, nếu tôi cần thêm các tệp "đối sánh" (đối tượng) có thể có phần mở rộng từ tập hợp sau: @ "txt", @ "pdf", @ "doc", @ "rtf", @ "png", @ "jpeg"? – eugen

4

Đối với một tên tập tin hợp lý hơn:

NSString *filename = [[url lastPathComponent] stringByAppendingPathExtension:[url pathExtension]];

4

Tôi biết đây là một câu hỏi cũ, nhưng đó là một trong những tốt và mọi thứ đã thay đổi trong iOS bài Sandboxing.

Đường dẫn tới tất cả các thư mục có thể đọc/ghi trong ứng dụng sẽ hiện có băm và Apple có quyền thay đổi đường dẫn đó bất kỳ lúc nào. Nó sẽ thay đổi trên mỗi lần khởi chạy ứng dụng chắc chắn.

Bạn sẽ cần phải nhận đường dẫn đến thư mục bạn muốn và bạn không thể mã hóa mã này giống như chúng tôi đã sử dụng để có thể thực hiện trong quá khứ.

Bạn yêu cầu thư mục tài liệu và trong mảng trả về, nó ở vị trí 0. Sau đó, từ đó, bạn sử dụng giá trị đó để cung cấp cho NSFileManager để nhận nội dung thư mục.

Mã bên dưới hoạt động trong iOS 7 và 8 để trả về một mảng nội dung trong thư mục tài liệu. Bạn có thể muốn sắp xếp nó theo sở thích của riêng bạn.

+ (NSArray *)dumpDocumentsDirectoryContents { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    NSError *error; 
    NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error]; 

    NSLog(@"%@", directoryContents); 
    return directoryContents; 
} 
8

Cảm ơn Alex,

Đây là phiên bản Swift

func listFilesOnDevice() { 

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentDirectory = paths[0] as! String 
    let manager = NSFileManager.defaultManager() 
    if let allItems = manager.contentsOfDirectoryAtPath(documentDirectory, error: nil) { 
     println(allItems) 
    } 
} 
1
NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir_path]; 

NSString *filename; 

while ((filename = [dirEnum nextObject])) 
{ 
    // Do something amazing 
} 

cho liệt kê qua TẤT CẢ các file trong thư mục

1

Swift 3.x

let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) { 
    print(allItems) 
} 
+0

cách lấy danh sách tệp từ "Tài liệu/Hộp thư đến"? và chọn bất kỳ cái nào. –

Các vấn đề liên quan