NSFileManager* fileManager = [NSFileManager defaultManager];
NSURL* url = [[fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSString* directory = [url path];
NSString* filePath = [directory stringByAppendingPathComponent:FILE_NAME];
if ([fileManager fileExistsAtPath:filePath])
{
[fileManager removeItemAtPath:filePath error:nil];
}
这是我的代码。执行时,文件将被删除,但空间仍然占用。这是将内容存储到文件中的代码。
NSFileManager* fileManager = [NSFileManager defaultManager];
NSURL* url = [[fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSString* directory = [url path];
NSString* filePath = [directory stringByAppendingPathComponent:FILE_NAME];
NSArray* oldArray = nil;
if ([fileManager fileExistsAtPath:filePath])
{
oldArray = [[NSArray alloc] initWithContentsOfFile:filePath];
[fileManager removeItemAtPath:filePath error:nil];
}
NSMutableArray* mergeArray = [[NSMutableArray alloc] initWithArray:arrayOfPersons];
[mergeArray addObjectsFromArray:oldArray];
if ( [mergeArray writeToFile:filePath atomically:YES]) NSLog(@"Written");
顺便说一下,存储一个只有一个对象的数组(一个带有2个键的NSDictionary)需要花费1 MB。是否有更便宜的存储方式?
答案 0 :(得分:2)
您需要对实验更加谨慎。 unix文件系统用文件做了很多东西。实际上,当您“删除”文件时,您所做的只是将其与文件系统取消链接。如果该文件在操作系统中的任何位置打开了另一个文件描述符,它将保持打开状态。
此外,还有许多优化可以重用文件节点。仅仅因为你删除了一个文件,并不意味着空间会自动返回。它可以在您的应用程序中“保留”,原因有几个,可供其他文件使用。在文件系统需要它之前,将它返回文件系统是没有意义的。
settings->general->usage
是对文件系统利用率的非常粗略的衡量。更好的衡量方法是直接访问文件和文件系统的属性。
以您的代码为基础,请考虑以下事项:
- (NSString*)workingDirectory {
NSFileManager* fileManager = [NSFileManager defaultManager];
NSURL* url = [[fileManager URLsForDirectory:NSCachesDirectory
inDomains:NSUserDomainMask] lastObject];
return [url path];
}
- (NSString*)filePath {
return [[self workingDirectory] stringByAppendingPathComponent:FILE_NAME];
}
现在,您可以看到整个文件系统的所有属性:
NSDictionary *attributes = [[NSFileManager defaultManager]
attributesOfFileSystemForPath:[self workingDirectory] error:0];
NSLog(@"file system attributes: %@", attributes);
以及具有此特定文件的那些:
NSDictionary *attributes = [[NSFileManager defaultManager]
attributesOfItemAtPath:[self filePath] error:0];
NSLog(@"file attributes: %@", attributes);
注意NSFileSystemFreeSize
和NSFileSize
。
运行您的应用,并转储这两个值。创建您的文件,然后再次转储它们。删除该文件,然后再次转储它们。
毕竟,即使删除后,您实际上也可能看到NSFileSystemFreeSize
上去了。请记住,系统本身正在创建临时文件,并且可能正在缓存这些文件系统节点以供将来使用。
如果您退出所有其他应用,则可以获得更一致的结果。然后,退出你的(双击电源按钮,X所有正在运行的应用程序)。在执行此操作之前删除文件。
现在,启动您的应用,不存在文件。
转储文件系统数据。
创建文件。
转储文件系统数据。
转储文件数据。
您应该看到该文件占用大约200-250字节,文件系统可用大小应该下降8192.
删除文件。
转储文件系统数据。可能至少与删除文件之前一样大。
退出应用(不在XCode中 - 双击电源,X应用)。
运行该应用。
转储文件系统数据。你应该看到数据回到你早些时候开始的时候。
总之,尽管文件系统可能看起来没有发布数据,但它确实有,但是你用来查询的工具可能只是不知道文件系统的细节。
另请注意,当应用程序运行时,它会使用大量文件系统资源来处理您未明确执行的操作。
我希望这是有道理的......
答案 1 :(得分:0)
您删除文件的代码看起来是正确的,但是当您不需要时,您将在URL和路径之间切换。您还应该在尝试删除文件时检查错误,以便了解它无法正常工作的原因。试试这个:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *directoryURLs = [fileManager URLsForDirectory:NSCachesDirectory
inDomains:NSUserDomainMask];
NSURL *directoryURL = [directoryURLs objectAtIndex:0];
NSURL *fileURL = [directoryURL URLByAppendingPathComponent:FILE_NAME];
if (!fileURL)
{
NSLog(@"Could not create URL for file.");
return;
}
NSError *err = nil;
if (![fileURL checkResourceIsReachableAndReturnError:&err])
{
NSLog(@"File is not reachable.\n"
"Error: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
err = nil;
[fileManager removeItemAtURL:fileURL error:&err];
if (err)
{
NSLog(@"Unable to delete existing file.\n"
"Error: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
答案 2 :(得分:0)
可能是'˚FILE_NAME`的长度大于或等于300个字符?这让我在前一段时间遇到了与NSFileManager类似的问题......