3

FSEventターゲットフォルダの状態を監視するためにを設定しました。変更が行われるたびに通知され、変更が行われたサブディレクトリへのパスも指定されるため、問題なく機能します。しかし、操作が実行されたことを理解したい場合はどうなりますか?ファイルは追加、変更、名前変更、または削除されましたか?

Mac Developer Libraryで、永続的なイベントを使用してそれを読んでいます

「アプリケーションが実行されていないときでも、どのファイルが変更されたかを確認できます。これにより、変更されたファイルのバックアップ、複数ファイルプロジェクトでの変更された依存関係の確認などのタスクを大幅に簡素化できます。」

しかし、よく理解していれば、これはディレクトリの現在の状態をイベントIDで定義された以前の状態と比較する方法にすぎません。したがって、ここでも、変更が発生したサブディレクトリへのパスのみを取得します。

私の質問はDirectory Hierarchy Snapshots、スナップショット間の時間に実行される操作を確認するために、ディレクトリの状態のスナップショットを作成して後で比較することにより、実際に「手動で」取得する必要があるのでしょうか。もっと速い方法はありませんか?

4

1 に答える 1

3

FSEvent(ファイルの追加、ファイルの名前変更、ファイルの削除、ファイルの変更)で監視されているフォルダー内のファイルに対するさまざまな操作を区別できるようにするために、次のことを行いました。

次のプロパティを使用してオブジェクトを作成しましたFile(を呼び出すことで、必要な数だけ取得できますattributesOfItemAtPath:error:)。

@property (strong) NSString *name;
@property (strong) NSString *type;
@property (strong) NSDate *creationDate;
@property (strong) NSDate *modificationDate;
@property (strong) NSString *hash;
@property (strong) NSString *path;

NSMutableArray次の方法で、ファイルオブジェクトを設定できます。

NSMutableArray *files = [[NSMutableArray alloc] init];
NSString *dirPath = //directory you are watching
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *theFiles =  [fileManager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:dirPath]
                                includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
                                                   options:NSDirectoryEnumerationSkipsHiddenFiles
                                                     error:nil];
NSArray* fileNames = [theFiles valueForKeyPath:@"lastPathComponent"];
if ( [fileNames count] > 0 ) {
    for (NSInteger i=0; i<[fileNames count]; i=i+1) {
        NSString *currentPath = [dirPath stringByAppendingString:[fileNames objectAtIndex:i]];
        NSError *error;
        NSDictionary *fileInfo = [fileManager attributesOfItemAtPath:currentPath error:&error];
        File *currentFile = [[File alloc] initWithName:[fileNames objectAtIndex:i]
                                                  withType:fileInfo.fileType
                                                  withPath:currentPath
                                                  withHash: //get file hash
                                          withCreationDate:fileInfo.fileCreationDate
                                   andWithModificationDate:fileInfo.fileModificationDate];
        [files addObject:currentFile];
}

ディレクトリにサブフォルダが含まれている場合は、すべてのサブフォルダに対してこのプロセスを繰り返し、Fileオブジェクトの配列を返すだけで十分です。

実行された操作を理解するには、のコールバック(に保存)の前(に保存NSMutableArray *oldSnap)と後に収集された(に保存)情報に直面するだけで十分です。最初にファイルとファイルを対峙させ、次にその逆を行う必要があります。NSMutableArray *newSnapFSEventoldSnapnewSnap

oldSnapに欠落している特定の名前のファイルがある場合は、newSnapこのファイルが削除されたか、名前が変更されたことを意味します。に同じハッシュを持つファイルがある場合newSnap、ファイルの名前は変更されています。それ以外の場合は、フォルダから削除されています。

比較を終えると、に同じ名前のファイルnewSnapとは異なるファイルがある場合、このファイルは変更されています。に欠落しているファイルがnewSnapにある場合、このファイルは新しく追加されたファイルです。fileModificationDateoldSnapoldSnap

ファイルの名前変更と変更の両方に関する解決策はまだ思いつきません。この答えが他の人の助けになることを願っています!

于 2013-01-18T21:55:15.780 に答える