2

例如,如果我这样做:

NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtURL:cacheDirectory
                                                                  includingPropertiesForKeys:@[NSURLContentAccessDateKey]
                                                                                     options:NSDirectoryEnumerationSkipsHiddenFiles
                                                                                errorHandler:nil];

NSURL *fileURL;
while (fileURL = [directoryEnumerator nextObject])
{
    NSDate *fileDate;
    [fileURL getResourceValue:&fileDate forKey:NSURLContentAccessDateKey error:nil];

    if ([cacheDate compare:fileDate] == NSOrderedDescending) // Delete all files with access date older then cacheDate(defined elsewhere)
        [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
}

目录枚举器是否会“损坏”,例如我会因为每个文件的索引更改而得到意外结果吗?

但是,我想使用该enumeratorAtURL方法,而不是contentsOfDirectoryAtURL因为我必须处理大量文件(超过 100,000 个)。所以contentsOfDirectoryAtURL会占用大量内存。

4

2 回答 2

3

在迭代容器时从容器中删除项目通常是一个坏主意。

fileURL您可以将要删除的所有 s 保存在数组中,然后遍历数组以删除文件。

像这样的东西:

NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init];

NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtURL:cacheDirectory
                                                                  includingPropertiesForKeys:@[NSURLContentAccessDateKey]
                                                                                     options:NSDirectoryEnumerationSkipsHiddenFiles
                                                                                errorHandler:nil];

NSURL *fileURL;
while (fileURL = [directoryEnumerator nextObject])
{
    NSDate *fileDate;
    [fileURL getResourceValue:&fileDate forKey:NSURLContentAccessDateKey error:nil];

    if ([cacheDate compare:fileDate] == NSOrderedDescending) // Delete all files with access date older then cacheDate(defined elsewhere)
        [urlsToDelete addObject:fileURL];
}

for (NSURL *fileURL in urlsToDelete) {
     [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
}
于 2012-11-01T13:47:31.607 回答
2

根据这个关于 Enumeration 的 Apple 文档

在枚举可变集合时删除、替换或添加到可变集合的元素是不安全的。如果您需要在枚举期间修改集合,您可以制作该集合的副本并使用该副本进行枚举,或者在枚举期间收集您需要的信息并在之后应用更改。

您可能希望将要删除的文件保存在另一个数组中,然后再执行删除。

于 2012-11-01T13:50:12.913 回答