【问题标题】:Proper Creation and Deletion of files - IOS正确创建和删除文件 - IOS
【发布时间】:2016-02-26 02:07:18
【问题描述】:

我正在将多个图像和视频从服务器下载到手机磁盘,以实现无缝播放(流媒体不是一种选择)。对于图像,我只需将数据转换为UIImage。对于视频,我在NSTemporaryDirectory 中创建了一个包含视频数据的文件。然后将AVPlayerItem 与该文件关联。

 NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tempFile%i.mov",i]];

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    //Do background work
                    [fileManager createFileAtPath:filePath contents:videoData attributes:nil];
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //Update UI
                        NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:filePath];

                        AVAsset *asset = [AVAsset assetWithURL:outputURL];
                        AVPlayerItem *item = [[AVPlayerItem alloc]initWithAsset:asset];

                        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:item, @"item", filePath, @"path", nil];
                        [self.pageImages replaceObjectAtIndex:i withObject:dic];
                    });
                });

在每个视频结束时,我都会删除该文件。

NSDictionary *dic = [self.pageImages objectAtIndex:self.pageIndex];
if (dic) {
    NSString *path = [dic valueForKey:@"path"];
    if ([fileManager fileExistsAtPath:path]) {
        [fileManager removeItemAtPath:path error:&error];
    }
}

当视图消失时,我还会循环遍历 NSTemporaryDirectory 只是为了确保所有文件都已被删除。

NSArray* tmpDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:NSTemporaryDirectory() error:NULL];
for (NSString *file in tmpDirectory) {
    NSLog(@"CALLED TO DELETE");
    [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), file] error:NULL];
}

当我第一次下载我的应用程序时,它只需要大约 5.0mb 的空间。但是在我观看了一系列视频和照片后,它的拍摄速度高达 >180.0mb。为什么即使在我删除了我创建的所有文件之后也会出现这种情况?

【问题讨论】:

  • 您如何测量占用的空间?如果您在模拟器中,您实际上可以观看 tmp 目录。我还注意到您忽略(传递 NULL)作为删除调用的错误。可能真的有问题?
  • @BenZotto 我在删除之前和之后打印了 tempDirectory 数组。之前显示我的文件,之后显示一个 nil 数组,因此正在删除文件。我正在从我的 iPhone 设置中获取空间。设置-通用-存储&iCloud-管理存储

标签: ios nsfilemanager disk temporary-files


【解决方案1】:

当您下载文件时,会创建临时文件。也许他们占用了存储空间?你可以在 NSURLSessionDownloadDelegate 方法中获取它们的 url

-(void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location

文档:

临时文件的文件 URL。因为文件是临时的,你 必须打开文件进行读取或将其移动到永久 返回之前在您应用的沙箱容器目录中的位置 来自这个委托方法。

【讨论】:

    【解决方案2】:

    如果仍有打开的文件描述符读取或写入该文件,则调用 removeItemAtPath 不会删除文件中的实际数据。在 C 级别,只有在关闭的文件描述符是为该进程打开的最后一个文件描述符时,unlink() 调用才会实际删除数据。另外需要注意的是,iOS下h.264解码的实现可以打开并持有该特定进程中没有直接打开的资源。只需通过调用 CoreVideo 对硬件资源非常小心,CoreVideo 的内部实现可以在后台跨进程共享资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2016-05-31
      • 2012-01-29
      相关资源
      最近更新 更多