【问题标题】:iPhone - properties of a list of filesiPhone - 文件列表的属性
【发布时间】:2011-05-08 22:01:06
【问题描述】:

我有一个 mutableArray,它在 tableView 中显示文件列表。我已将这些文件存储在一个目录中。

我正在使用NSfileManager 类和attributesOfItemAtPath 方法来检索文件的一些属性,例如fileSize、fileType..

在第二阶段,我试图有一个 detailView 控制器,当在 tableView 中触摸时它会显示特定文件的属性。

问题是我不知道如何将这些属性(如 fileSize 和 fileType)分别绑定到 NSDictionary 并使其显示在该特定文件的 detailView 中。

这是我列出文件和列出属性的源代码。

- (void)listFiles {

    NSFileManager *fm =[NSFileManager defaultManager];
    NSError *error = nil;
    NSString *parentDirectory = @"/Users/akilan/Documents";
    NSArray *paths = [fm contentsOfDirectoryAtPath:parentDirectory error:&error];
    if (error) {
        NSLog(@"%@", [error localizedDescription]);
        error = nil;
    }
    directoryContent = [[NSMutableArray alloc] init];
    for (NSString *path in paths){
        NSString *documentsDirectory = [[path lastPathComponent] stringByDeletingPathExtension];
        [directoryContent addObject:documentsDirectory];
    }
}

-(void) willProcessPath {
    NSString *parentDirectory = @"/Users/akilan/Documents";
    NSArray *paths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:parentDirectory error:nil];
    for (NSString *path in paths){
        filesPath = [parentDirectory stringByAppendingPathComponent:path];
        NSDictionary *attrDir = [[NSFileManager defaultManager]attributesOfItemAtPath:filesPath error:nil];
        filesSize = [attrDir objectForKey:NSFileSize];
        filesName = (NSString *)directoryContent;
        filesType = [path pathExtension];
        createdDate = [attrDir objectForKey:NSFileCreationDate];
        modifiedDate = [attrDir objectForKey:NSFileModificationDate];
    }
}

请帮助我进行下一步..提前致谢..

【问题讨论】:

  • NSString *parentDirectory = @"/Users/akilan/Documents";无法在真实设备上运行
  • 是的。我只是在模拟器中尝试。在设备中使用时我会更改目录。
  • 如果您接受能解决您的问题的答案,那就太好了。或者至少提供某种反馈,而不是不再回答。

标签: iphone uitableview detailsview nsfilemanager


【解决方案1】:

试试这样的:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self listFiles];
}



- (void)listFiles {

    NSFileManager *fm =[NSFileManager defaultManager];
    NSError *error = nil;
    NSString *parentDirectory = [self getDocumentsPath];
    NSArray *paths = [fm contentsOfDirectoryAtPath:parentDirectory error:&error];

    if (error) {
        NSLog(@"%@", [error localizedDescription]);
        error = nil;
    }

    NSMutableArray *array = [[NSMutableArray alloc] init];
    self.directoryContent = array;
    [array release];

    for (NSString *path in paths){
        NSString *fullPath = [self getPathToFileInDocumentsDirectory:path];
        NSMutableDictionary *filePropertiesDictionary = [NSMutableDictionary dictionaryWithDictionary:[[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:nil]];
        [filePropertiesDictionary setObject:fullPath forKey:@"fullPath"];
        [filePropertiesDictionary setObject:path forKey:@"fileName"];
        [directoryContent addObject:filePropertiesDictionary];
    }
    NSLog(@"%@", directoryContent);
}

- (NSString *)getDocumentsPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];

    return documentsDirectoryPath;  
}
- (NSString *)getPathToFileInDocumentsDirectory:(NSString *)fileName {
    return [[self getDocumentsPath] stringByAppendingPathComponent:fileName];
}

【讨论】:

  • 嗯。我在 Xcode 中尝试过,它确实有效。究竟是什么不适合你?
  • tableView 和控制台中什么都没有。
  • Documents 文件夹中有文件吗?如果没有,您将不会得到任何输出。无论如何,视图中没有输出,只是在控制台中。确保将一些文档放在该文件夹中...如果您想知道计算机上文件夹的路径,只需在某处放置一个 NSLog -> NSLog(@"%@", parentDirectory);
  • 现在我在路径中添加了一些文件。但它显示一个错误:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSCFDictionary isEqualToString:]:无法识别的选择器发送到实例 0x6a2cf40'
  • 好吧,那么您的代码中的某个地方可能有错误。把你完整的 xcode 项目贴在某个地方,我去看看。
【解决方案2】:
#import <UIKit/UIKit.h>

@interface MyFilesList : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *directoryContent;
    IBOutlet UITableView *filesTable;
    IBOutlet NSNumber *filesSize;
    IBOutlet NSString *filesName;
    IBOutlet NSString *filesType;
    IBOutlet NSString *filesPath;
    IBOutlet NSDate *createdDate;
    IBOutlet NSDate *modifiedDate;
    NSMutableDictionary *filesDirectory;
}

@property (nonatomic, retain) NSMutableArray *directoryContent;
@property (nonatomic, retain) IBOutlet UITableView *filesTable;
@property (nonatomic, retain) IBOutlet NSNumber *filesSize;
@property (nonatomic, retain) IBOutlet NSString *filesName;
@property (nonatomic, retain) IBOutlet NSString *filesType;
@property (nonatomic, retain) IBOutlet NSString *filesPath;
@property (nonatomic, retain) IBOutlet NSDate *createdDate;
@property (nonatomic, retain) IBOutlet NSDate *modifiedDate;
@property (nonatomic, retain) NSMutableDictionary *filesDirectory;

- (void)listFiles;
- (void) willProcessPath;
@end

【讨论】:

  • 1.我没有看到您在任何地方设置所有这些变量。 2.如果使用[NSDictionary dictionaryWithObjectsAndKeys:],则需要在冒号后指定一个对象,然后是key,然后是object,然后是key等,然后是nil。当前,您正在使用键 (NSString *)directoryContent 存储 filesName(它是 nil,因为您没有分配它)。这没有任何意义。
【解决方案3】:
- (void)listFiles {

    NSFileManager *fm =[NSFileManager defaultManager];
    NSError *error = nil;
    NSString *parentDirectory = @"/Users/akilan/Documents";
    NSArray *paths = [fm contentsOfDirectoryAtPath:parentDirectory error:&error];
    if (error) {
        NSLog(@"%@", [error localizedDescription]);
        error = nil;
    }
    directoryContent = [[NSMutableArray alloc] init];
    for (NSString *path in paths){
        NSString *documentsDirectory = [[path lastPathComponent] stringByDeletingPathExtension];
        [directoryContent addObject:documentsDirectory];
    }
}

-(void) willProcessPath {
    NSString *parentDirectory = @"/Users/akilan/Documents";
    NSArray *paths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:parentDirectory error:nil];
    for (NSString *path in paths){
        filesPath = [parentDirectory stringByAppendingPathComponent:path];
        NSDictionary *attrDir = [[NSFileManager defaultManager]attributesOfItemAtPath:filesPath error:nil];
         filesDirectory = [NSDictionary dictionaryWithObjectsAndKeys:filesSize, [attrDir objectForKey:NSFileSize],
                      filesName, (NSString *)directoryContent, filesType, [path pathExtension],
                      createdDate, [attrDir objectForKey:NSFileCreationDate],
                      modifiedDate, [attrDir objectForKey:NSFileModificationDate], nil];
        NSLog(@"%@", filesDirectory);
    }
}

【讨论】:

    【解决方案4】:

    为什么不创建一个具有以下属性的类“FileDescriptor”:

    NSString *fileName;
    NSString *fileSize;
    NSString *fileType;
    NSDate *createdDate;
    NSDate *modifiedDate;
    

    在遍历您的目录时,您为每个文件创建一个此类的实例,并将其存储在一个数组(或字典,如果您愿意)中。然后你可以使用该数组来

    a) 为您的 UITableViewCells 提供数据

    b) 在单击单元格时显示每个文件的详细视图。

    如果您想改用字典(我认为它不那么“干净”),您可以这样做:

    NSDictionary *fileProperties = [NSDictionary dictionaryWithObjectsAndKeys:
      fileSize, @"fileSize", 
      fileName, @"fileName", nil]; 
    

    【讨论】:

    • 谢谢你。但是你能用一个源代码详细叙述一下如何使用NSDictionary吗?
    • 好吧,如果你想使用字典而不是自定义对象(我认为这会使代码更加混乱,你可以像这样存储这些值:NSDictionary *fileProperties = [NSDictionary dictionaryWithObjectsAndKeys:fileSize , @"fileSize", fileName, @"fileName" ... etc...., nil];
    • 如果您想使用字典而不是数组,请将描述文件的对象放入字典中,例如绝对文件路径作为键。当您检索它们以显示在表格中时,您可以在 cellForRowAtIndexPath 方法中使用 FileDescriptor *aFileDescriptor = [[yourDictionary allValues] objectAtIndex:indexPath.row]。
    • 如您所说,我想使用字典而不是自定义对象。您能给我发一份使用这种方法的参考吗?或者任何关于如何启动的源代码?
    • 嗨,我试过了。但它不工作。当我运行它时,控制台显示(空)。如果可能,请在我的代码中使用您的方法并发布。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多