19

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

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];

谁能看到我哪里出错了?

4

6 回答 6

27

斯威夫特 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
    }
}
于 2016-11-06T08:25:08.960 回答
23

尝试这个。我有同样的问题并解决了类似下一个:

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
}

希望它有所帮助;)

于 2012-11-22T16:28:19.783 回答
6

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

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
    }
}
于 2016-08-30T20:12:42.647 回答
3

如果您收到错误消息:

“CFURLCopyResourcePropertyForKey 失败,因为它通过了这个没有方案的 URL”

您可以尝试通过在将其转换为 NSURL 之前将“file:///”附加到您的 NSString 文件路径来解决此问题,它适用于我的情况。

于 2013-02-04T19:31:13.440 回答
3

还可以这样做:

NSURL* file = ...
NSError* error;`
NSDate *creationDate = [[NSFileManager defaultManager] attributesOfItemAtPath:file.path error:&error].fileCreationDate;
于 2015-12-21T04:24:25.363 回答
1

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

方式一:

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

方式二:

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

  • CFDateRef modifDate = MDItemCopyAttribute(itemRef, kMDItemContentModificationDate);

  • NSDate* modifyDate = (__bridge NSDate*) modifDate;
  • NSLog(@"修改日期%@", modifyDate);

您还可以打印 MDItem 提供的各种其他属性: NSLog(@"All attributes%@", attributes);

于 2019-02-25T07:52:49.660 回答