我有一個應用程序,監視傳入作業的文件夾,然後處理它們。作業由文件夾中包含多個作業文件的文件夾組成。作業通常通過互聯網複製,所以當一個文件夾被添加到我的監視文件夾時我讓我的應用程序獲取作業文件夾內文件的屬性,等待20秒,然後比較NSFileSize的當前屬性以查看是否存在有任何變化。當一切都匹配,並且沒有檢測到更改時,它可以傳遞作業文件夾一起處理。這是我的代碼:檢查文件大小的變化
while (fileSizes == NO && fileCount == NO) {
NSLog(@"going for a loop");
NSArray *jobFiles = [fm subpathsAtPath:jobPath];
NSMutableArray *jobFileAttrs = [[NSMutableArray alloc] init];
int i = 0;
while (i < [jobFiles count]) {
NSString *filePath = [jobPath stringByAppendingPathComponent:[jobFiles objectAtIndex:i]];
[jobFileAttrs addObject:[fm attributesOfItemAtPath:filePath error:nil]];
++i;
}
sleep(20);
NSArray *jobFiles2 = [fm subpathsAtPath:jobPath];
NSMutableArray *jobFileAttrs2 = [[NSMutableArray alloc] init];
i = 0;
while (i < [jobFiles2 count]) {
NSString *filePath = [jobPath stringByAppendingPathComponent:[jobFiles2 objectAtIndex:i]];
[jobFileAttrs2 addObject:[fm attributesOfItemAtPath:filePath error:nil]];
++i;
}
if ([jobFiles count] == [jobFiles2 count]) {
i = 0;
fileSizes = YES;
while (i < [jobFiles count]) {
NSLog(@"Does %ul = %ul", [[jobFileAttrs objectAtIndex:i] objectForKey:NSFileSize], [[jobFileAttrs2 objectAtIndex:i] objectForKey:NSFileSize]);
if ([[jobFileAttrs objectAtIndex:i] objectForKey:NSFileSize] != [[jobFileAttrs2 objectAtIndex:i] objectForKey:NSFileSize]){
fileSizes = NO;
}
++i;
}
if (fileSizes)
fileCount = YES;
}
此代碼按預期工作Lion中,但是當我在Snow Leopard上運行的應用程序,我得到了NSFileSize屬性值不一致。每次循環運行時,我都會得到一個完全不同的值,即使是前一個循環也是如此。很明顯,這對於一個文件夾來說已經不再被複制,並且應該給出文件大小的匹配值。
爲什麼Snow Leopard不能正常工作,我需要做些什麼來解決這個問題?我的部分問題是我只在Lion機器上進行開發,所以我必須進行構建,然後使用調試器將其轉移到雪豹機器上進行測試。這讓我很難排除故障。
感謝您的信息。奇怪的是,比較這兩個對象將在獅子工作,但不是雪豹。我實際上使用kqueues作爲我的主要手錶文件夾。我只恢復到輪詢,因爲在該文件夾內將添加其他作業文件夾。每個作業文件夾的名稱,文件數量,文件大小等都是相當隨機的。我不一定需要知道何時對作業文件夾進行了更改,而是什麼時候更改已停止(所有文件都從遠程計算機傳輸完成)。我也會研究NSTimer。 – Kris