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 *newSnap
FSEvent
oldSnap
newSnap
oldSnap
に欠落している特定の名前のファイルがある場合は、newSnap
このファイルが削除されたか、名前が変更されたことを意味します。に同じハッシュを持つファイルがある場合newSnap
、ファイルの名前は変更されています。それ以外の場合は、フォルダから削除されています。
比較を終えると、に同じ名前のファイルnewSnap
とは異なるファイルがある場合、このファイルは変更されています。に欠落しているファイルがnewSnapにある場合、このファイルは新しく追加されたファイルです。fileModificationDate
oldSnap
oldSnap
ファイルの名前変更と変更の両方に関する解決策はまだ思いつきません。この答えが他の人の助けになることを願っています!