检查文件是不是更新

Posted

技术标签:

【中文标题】检查文件是不是更新【英文标题】:Check if file is updated检查文件是否更新 【发布时间】:2013-03-03 18:41:09 【问题描述】:

我有 ios 应用程序。文档目录中有一些文件。我需要检查这些文件是否被编辑或替换。正确的方法是什么?我应该对文件或上次编辑时间进行一些哈希(如何在 iOS 中获取这个时间)还是有更好的方法来实现这个?

【问题讨论】:

您肯定可以查看它的更新时间。继续将更新的时间保存到某个 plist 并检查它。 还有谁可以在运行时在您的应用程序旁边编辑/替换Documents 目录中的文件...? iTunes同步,可以从itunes添加一些文件到documets目录 如何获取文件编辑时间? @George,在这种情况下,请尝试为其实施现有解决方案,例如 this 【参考方案1】:

您可以使用此代码获取文件修改日期:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSDictionary* attributes = [fileManager attributesOfItemAtPath:path error:nil];

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

here你可以找到attributesOfItemAtPath:error:函数的文档,here你可以得到的文件属性列表

【讨论】:

【参考方案2】:

散列整个文件会起作用,但对于大多数用途来说有点矫枉过正。我会结合一些可以快速访问的东西:

NSFileModificationDate NSFileSize NSFileCreationDate NSFileSystemFileNumber(inode 编号)

如果您使用的是基于 NSURL 的 API (iOS 4.0+),我会使用

NSURLContentModificationDateKey(修改时间) NSURLFileSizeKey NSURLCreationDateKey NSURLFileAllocatedSizeKey NSURLAttributeModificationDateKey (st_ctime?)

我至少会使用修改时间和文件大小。其他的东西通常不会改变,除非内容发生变化,但有几点需要注意:

如果用户从备份中恢复,NSFileSystemFileNumber(inode 编号)可能会发生变化。 NSURLAttributeModificationDateKey 应该在 attributes 改变时改变。如果是st_ctime(我不完全确定是这样),几乎可以保证捕获对文件的所有更改,但也可能捕获很多不代表的更改更改文件内容。我不知道此类更改是否发生在外部(例如,iTunes/iCloud 备份是否将属性设置为备份过程的一部分?)。

【讨论】:

以上是关于检查文件是不是更新的主要内容,如果未能解决你的问题,请参考以下文章

PHP在更新SQL表之前检查文件是不是存在

检查文件是不是等于其他文件

C语言 检查文件是不是存在

VB检查多个文件是不是存在

在VC里如何检查一个文件是不是存在

检查文件是不是在应用程序之外被修改