【问题标题】:How do you get the creation date of files in a directory in Objective c如何在Objective c中获取目录中文件的创建日期
【发布时间】:2014-01-06 20:42:56
【问题描述】:

我正在学习 Objective-C,我正在将 Applescript 实用程序转换为 Objective-C。

我需要了解如何获取目录中所有文件的NSFileCreationDate,以便将最新文件复制到另一个位置。我不知道如何获取目录中每个文件的NSFileCreationDate。

此代码获取目录列表,但每次我尝试获取 NSFileCreationDate 时,它都会给我封闭文件夹的 NSFileCreationDate。

我必须读取一个 plist 文件才能获得备份位置的路径。

  1. 为备份位置读取 plist 文件
  2. 获取文件的创建日期
  3. 将最新的文件复制到 * wholepath , 桌面上的文件

    NSString filePath = [@"~/Library/Preferences/com.viive.Viive.plist" stringByExpandingTildeInPath]; NSMutableDictionary plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

    NSString *value;
    value = [plistDict objectForKey:@"backupPath"];
    
    
    NSFileManager *filemgr;
    NSArray *filelist;
    filemgr = [NSFileManager defaultManager];
    filelist = [filemgr contentsOfDirectoryAtPath:value error: nil];
    NSArray *array = filelist;
    NSUInteger index = 0;
    for (id element in array) {
    NSLog(@"Element at index %lu is: %@", (unsigned long)index, element);
    index++;
    }
    NSDictionary* fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:////     error:nil];
    NSDate *result = [fileAttribs fileCreationDate]; //or fileModificationDate
    NSLog(@"%@",result);
    
    //////
    
     NSString* desktop = [@"~/Desktop/LOGS-I-NEED-" stringByExpandingTildeInPath];
        NSString* computername = [[NSHost currentHost] localizedName];
        NSString* wholepath = [desktop stringByAppendingString:computername];
    

我已经用谷歌搜索了这个信息,因为我是新手,所以我找到的答案对我来说没有多大意义。如果有人知道更好的方法,我会全力以赴。

谢谢大家!!

【问题讨论】:

    标签: objective-c macos xcode5


    【解决方案1】:

    这应该会有所帮助:

    for (NSString file in array) {
        NSLog (@"%@", file);
        NSString *path = [filePath stringByAppendingPathComponent: file];
        NSDictionary* fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
        NSDate *result = [fileAttribs fileCreationDate]; //or fileModificationDate
        NSLog(@"%@",result);
     }
    

    【讨论】:

    • 这段代码给了我 -[__NSCFString path]: unrecognized selector sent to instance 0x106107c30
    • 我得到 (null) 然后如果我再试一次,我会得到一个文件内容列表,但后来我得到这个 *** -[__NSArrayM objectAtIndex:]: index 34 beyond bounds [0 .. 33 ]
    • 这可以改进一点。首先,使用快速枚举而不是索引数组。其次,使用stringByAppendingPathComponent: 而不是stringWithFormat:。
    • 更新了枚举,但仍然得到 - 不兼容的指针类型将 NSArray* 发送到 NSString* 类型的参数
    • @Breathable:感谢您的建议。我已经更新了示例。
    【解决方案2】:

    以下可能会有所帮助

    // This is the main routine to read the contents of a directory (into array of URL)
    - (NSArray *)readDirectory:(NSString *)path error:(NSError **)error {
        NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES];
        NSArray *array = [[NSFileManager new]
                          contentsOfDirectoryAtURL:url
                          includingPropertiesForKeys:properties
                          options:(NSDirectoryEnumerationSkipsPackageDescendants |
                                   ((showHiddenFiles | unHideDir| unHideAllDir) ? 0 : NSDirectoryEnumerationSkipsHiddenFiles))
                          error:error];
        if (unHideDir) {
            NSIndexSet *unDotted = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger index, BOOL *stop) {
                NSString *name;
                [obj getResourceValue:&name forKey:NSURLNameKey error:nil];
                if ([name characterAtIndex:0] == '.')   return NO;  // exclude .files
                return YES;
            }];
            return [array objectsAtIndexes:unDotted];
        }
        return array;
    }
    

    您可以省略unHideDir 和((showHiddenFiles | unHideDir| unHideAllDir)

    这依赖于properties 的数组。我在initialize中设置了这个

    + (void)initialize {
        if (self == [DirectoryItem class]) {
            leafNode = [[NSMutableArray alloc] init];
            [self loadPreferences];
            properties = [NSArray arrayWithObjects:
                          NSURLNameKey,
                          NSURLFileSizeKey, NSURLIsAliasFileKey, NSURLIsPackageKey,
                          NSURLIsDirectoryKey, NSURLIsSymbolicLinkKey, NSURLIsRegularFileKey,
                          NSURLCreationDateKey, NSURLContentModificationDateKey,
                          NSURLLocalizedTypeDescriptionKey, nil];
            dirSortDescriptor = [NSArray arrayWithObject:
                                 [[NSSortDescriptor alloc] initWithKey:COLUMNID_NAME
                                                             ascending:YES
                                                              selector:@selector(localizedStandardCompare:)]];
        }
    }
    

    你可以用类似的东西解压日期

    NSDate *tempDate;
    [path getResourceValue:&tempDate forKey:NSURLCreationDateKey error:nil];
    if ([tempDate timeIntervalSince1970] < 24*3600) tempDate = nil;
    cDate = [tempDate copy];
    [path getResourceValue:&tempDate forKey:NSURLContentModificationDateKey error:nil];
    wDate = [tempDate copy];
    

    【讨论】:

      【解决方案3】:

      在你们的帮助下,我找到了正确的方向。 感谢所有评论的人!

      这是我的最终代码,可以帮助遇到类似问题的其他人。

      NSString *s = [NSString stringWithFormat:@"tell application \"12345\" to backup"];
      NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s];
      [as executeAndReturnError:nil];
      
      ///////
      
      NSString *filePath = [@"~/Library/Preferences/com.12345.12345.plist" stringByExpandingTildeInPath];
      NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
      
      NSString *value;
      value = [plistDict objectForKey:@"backupPath"];
      
      /////
      
      NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
      [dateformat setDateFormat:@"YYY-MM-dd'T'HH:MM:ss'"];
      NSDate *maxdate = [NSString stringWithFormat:@"1900-01-01 00:00:00 +0000"];
      
      NSFileManager *filemgr;
      NSArray *filelist;
      
      filemgr = [NSFileManager defaultManager];
      filelist = [filemgr contentsOfDirectoryAtPath:value error: nil];
      NSArray *array = filelist;
      NSUInteger index = 0;
      NSString *currentdb;
      for (id element in array) {
          NSLog(@"Element at index %lu is: %@", (unsigned long)index, element);
      
          NSString* slash = @"/";
          NSString* elementwithpath = value;
          NSString* wholepathh = [elementwithpath stringByAppendingString:slash];
          wholepathh = [wholepathh stringByAppendingString:element];
      
      
          NSDictionary* fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:wholepathh error:nil];
          NSDate *result = [fileAttribs fileCreationDate]; //or fileModificationDate
          NSLog(@"%@",result);
          index++;
      
          if (result > maxdate)
          {
              maxdate = result;
              currentdb = wholepathh;
          }
          NSLog(wholepathh);
      }
      NSLog(currentdb);
      
      /////
      
      NSString* desktop = [@"~/Desktop/LOGS-I-NEED-" stringByExpandingTildeInPath];
      NSString* computername = [[NSHost currentHost] localizedName];
      NSString* wholepath = [desktop stringByAppendingString:computername];
      NSString* slash = @"/";
      
      NSString* filename = [[currentdb lastPathComponent] stringByDeletingPathExtension];
      
      
      NSString* totalpath =[ wholepath stringByAppendingString:slash];
      NSString* finalpath =[ totalpath stringByAppendingString:filename];
      
      NSError * error = nil;
      filemgr = [NSFileManager defaultManager];
      
      
      ([filemgr copyItemAtPath:currentdb toPath:finalpath error:&error]);
      
      if (error != nil)
      {
          NSLog(@"error creating directory: %@", error);
          //..
      }
      else
      {
          NSLog(@"Copying the 12345 Backup worked!");
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2020-06-30
        • 2013-06-16
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多