gpt4 book ai didi

iphone - 使用 NSDirectoryEnumerator 迭代目录时从目录中删除文件

转载 作者:行者123 更新时间:2023-12-03 20:30:47 26 4
gpt4 key购买 nike

如果我这样做:

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 占用大量内存。

最佳答案

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

您可以将要删除的所有 fileURL 保存在一个数组中,然后迭代该数组来删除文件。

类似这样的事情:

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];
}

关于iphone - 使用 NSDirectoryEnumerator 迭代目录时从目录中删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com