我有一个应用程序,监视传入作业的文件夹,然后处理它们。作业由文件夹中包含多个作业文件的文件夹组成。作业通常通过互联网复制,所以当一个文件夹被添加到我的监视文件夹时我让我的应用程序获取作业文件夹内文件的属性,等待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