簡體   English   中英

在 UITableView 中列出 iOS 文檔目錄中保存的文件?

[英]List saved files in iOS documents directory in a 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];

但是,我希望在成功保存每個文件后將其添加到 UITableView 中。 當 UITableView 中的文件被點擊時,我希望 UIWebView 導航到該文件(全部脫機)。

另外 - 我怎樣才能獲得文件名和結尾,例如“logo.png”而不是http://www.reddexuk.com/logo.png

我怎樣才能做到這一點?

這是我用來獲取目錄內容的方法。

-(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;
}
-(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; }

上面的例子是不言自明的。 我希望它能回答你的第二個問題。

獲取目錄的內容

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

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

要獲取最后一個路徑組件,

[[path pathComponents] lastObject]

謝謝亞歷克斯,

這是 Swift 版本

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

我知道這是一個老問題,但這是一個好問題,iOS 沙盒后的情況發生了變化。

應用程序中所有可讀/可寫文件夾的路徑現在包含一個哈希值,Apple 保留隨時更改該路徑的權利。 它肯定在每次應用程序啟動發生變化。

您需要獲取所需文件夾的路徑,並且不能像過去那樣對其進行硬編碼。

您請求文檔目錄,在返回數組中,它位於位置 0。然后,您使用該值提供給 NSFileManager 以獲取目錄內容。

下面的代碼在 iOS 7 和 8 下工作以返回文檔目錄中的內容數組。 您可能希望根據自己的喜好對其進行排序。

+ (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;
}

對於更合理的文件名:

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

NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir_path];

NSString *filename;

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

用於枚舉目錄中的所有文件

斯威夫特 5

返回 Documents 目錄中所有 MP4/M4V 視頻文件的 URL 數組的函數。 如果您想要所有文件,只需刪除filter

它只檢查頂級目錄中的文件。 如果您還想列出子目錄中的文件,請刪除.skipsSubdirectoryDescendants選項。

func listVideos() -> [URL] {
    let fileManager = FileManager.default
    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]

    let files = try? fileManager.contentsOfDirectory(
        at: documentDirectory,
        includingPropertiesForKeys: nil,
        options: [.skipsSubdirectoryDescendants, .skipsHiddenFiles]
    ).filter {
        ["mp4", "m4v"].contains($0.pathExtension.lowercased())
    }

    return files ?? []
}

斯威夫特 3.x

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM