web-dev-qa-db-ja.com

ファイルの作成日または変更日を取得する

このコードを使用して、ファイルの最終変更日を取得しようとしています。

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

誰かが私がどこで間違っているのか見ることができますか?

17
Robert

これを試して。私は同じ問題を抱えていて、次のようなもので解決しました:

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
}

それが役に立ったことを願っています;)

22
zvjerka24

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
    }
}
18
coldfire

これが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
    }
}
6
FBente

エラーが発生した場合:

「スキームのないこのURLが渡されたため、CFURLCopyResourcePropertyForKeyが失敗しました」

NSURLに変換する前にNSStringファイルパスに「file:///」を追加することでこれを解決することができます。私の場合はうまくいきました。

3
Tonnie

次のこともできます。

NSURL* file = ...
NSError* error;`
NSDate *creationDate = [[NSFileManager defaultManager] attributesOfItemAtPath:file.path error:&error].fileCreationDate;
3
Alexandre G

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 * attributes =(__ bridge NSDictionary *)MDItemCopyAttributes(itemRef、(__ bridge CFArrayRef)attributeNames);

  • CFDateRef modifDate = MDItemCopyAttribute(itemRef、kMDItemContentModificationDate);

  • NSDate * modifyDate =(__ bridge NSDate *)modifDate;
  • NSLog(@ "変更日%@"、modificationDate);

MDItemによって提供される他のさまざまな属性を出力することもできます。NSLog(@ "All attributes%@"、attributes);

1