このコードを使用して、ファイルの最終変更日を取得しようとしています。
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];
誰かが私がどこで間違っているのか見ることができますか?
これを試して。私は同じ問題を抱えていて、次のようなもので解決しました:
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
}
それが役に立ったことを願っています;)
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
}
}
これが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
}
}
エラーが発生した場合:
「スキームのないこのURLが渡されたため、CFURLCopyResourcePropertyForKeyが失敗しました」
NSURLに変換する前にNSStringファイルパスに「file:///」を追加することでこれを解決することができます。私の場合はうまくいきました。
次のこともできます。
NSURL* file = ...
NSError* error;`
NSDate *creationDate = [[NSFileManager defaultManager] attributesOfItemAtPath:file.path error:&error].fileCreationDate;
MacOSシステムのどのファイルでも、以下のオプションのいずれかを使用して、変更日を簡単に取得できます。
方法1:
方法2:
NSDictionary * attributes =(__ bridge NSDictionary *)MDItemCopyAttributes(itemRef、(__ bridge CFArrayRef)attributeNames);
CFDateRef modifDate = MDItemCopyAttribute(itemRef、kMDItemContentModificationDate);
MDItemによって提供される他のさまざまな属性を出力することもできます。NSLog(@ "All attributes%@"、attributes);