检索文件创建或修改日期

时间:2012-11-21 16:19:31

标签: ios objective-c xcode last-modified nsdocumentdirectory

我正在使用这段代码尝试检索文件的最后修改日期:

NSError *error = nil;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath: myFilePath error:&error];

        if (attributes != nil) {
            NSDate *date = (NSDate*)[attributes objectForKey: NSFileModificationDate];
            NSLog(@"Date modiifed: %@", [date description]);
        }
        else {
            NSLog(@"Not found");
        }

这适用于主捆绑包中的文件,但如果文件位于应用程序文档文件夹的子目录中,则不适用myFilePath,如下所示:

/Users/User/Library/Application Support/iPhone Simulator/6.0/Applications/The App ID Number/Documents/mySubdirectory/My Saved File

它不断返回“未找到”。

我知道文件在那里,因为我可以用finder查看它。我也尝试删除文件名中的空格,但这没有效果。

错误日志说没有这样的文件或目录,所以当我尝试将文件复制到文档目录时,看起来肯定出错了。

奇怪的是,使用contentsOfDirectoryAtPath遍历文档子目录会将文件显示为存在。

我尝试对路径进行硬编码并以编程方式检索它:

*myFolder = [documentsDirectory stringByAppendingPathComponent:@"myFolder"];
*myFilePath = [myFolder stringByAppendingPathComponent:theFileName];

谁能看到我出错的地方?

5 个答案:

答案 0 :(得分:18)

试试这个。我遇到了同样的问题并解决了下一个问题:

NSURL *fileUrl = [NSURL fileURLWithPath:myFilePath];
NSDate *fileDate;
[fileUrl getResourceValue:&fileDate forKey:NSURLContentModificationDateKey error:&error];
if (!error)
{
//here you should be able to read valid date from fileDate variable
}

希望它有所帮助;)

答案 1 :(得分:13)

Swift 3解决方案:

func fileModificationDate(url: URL) -> Date? {
    do {
        let attr = try FileManager.default.attributesOfItem(atPath: url.path)
        return attr[FileAttributeKey.modificationDate] as? Date
    } catch {
        return nil
    }
}

答案 2 :(得分:6)

这是一个类似Swift的@ zvjerka24解决方案:

func lastModified(path: String) -> NSDate? {
    let fileUrl = NSURL(fileURLWithPath: path)
    var modified: AnyObject?
    do {
        try fileUrl.getResourceValue(&modified, forKey: NSURLContentModificationDateKey)
        return modified as? NSDate
    } catch let error as NSError {
        print("\(#function) Error: \(error)")
        return nil
    }
}

答案 3 :(得分:3)

如果收到错误:

  

" CFURLCopyResourcePropertyForKey失败,因为它传递了这个没有方案的网址"

您可以尝试通过附加" file:///"来解决此问题。在将它转换为NSURL之前的NSString文件路径,它在我的情况下工作。

答案 4 :(得分:1)

对于macOS系统中的任何文件,我们可以使用以下任一选项轻松获得修改日期:

方法1:

  • NSString * path = @“文件路径”;
  • NSError * err = nil;
  • NSDictionary * dic2 = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&err];
  • NSLog(@“文件修改日期:%@”,dic2 [NSFileModificationDate]);

方法2:

  • MDItemRef itemRef = MDItemCreate(kCFAllocatorDefault,(__bridge CFStringRef)path);
  • NSArray * attributeNames =(__bridge NSArray *)MDItemCopyAttributeNames(itemRef);
  • NSDictionary *属性=(__bridge NSDictionary *)MDItemCopyAttributes(itemRef,(__bridge CFArrayRef)attributeNames);

  • CFDateRef modifDate = MDItemCopyAttribute(itemRef,kMDItemContentModificationDate);

  • NSDate * modificationDate =(__bridge NSDate *)modifDate;
  • NSLog(@“修改日期%@”,修改日期);

您还可以打印MDItem提供的其他各种属性: NSLog(@“所有属性%@”,属性);