【问题标题】:NSFileManager not deleting a file that existsNSFileManager 不删除存在的文件
【发布时间】:2012-05-23 19:42:42
【问题描述】:

我在使用 NSFileManager 功能时遇到了一些问题。 这在模拟器和 iPhone 设备 (iOS 5.1) 上都会发生。

基本上,我有一堆文件存储在我创建的文档中。现在我正在尝试将一个文件(存储在路径中)移动到另一个名称的同一目录中,以检查删除是否有效。

if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) {
BOOL success = [[NSFileManager defaultManager] moveItemAtPath:path toPath:[path            stringByAppendingString:@".deleted"] error:&error];
if (!success) {
        NSLog(@"Error removing file at path: %@", error.localizedDescription);
    }
}

这两个文件的输出是 pathpath.deleted。 我最终只想使用 removeItemAtPath 删除文件,但这不起作用。它返回成功,但如果我在文件目录中看到它,即使一个小时后我仍然可以在那里看到它。

【问题讨论】:

    标签: iphone ios nsfilemanager


    【解决方案1】:

    如果你想删除一个文件,你应该使用removeItemAtPath:myPath error:NULLlike

    NSError *error;
    if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) {
        BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
        if (!success) {
            NSLog(@"Error removing file at path: %@", error.localizedDescription);
        }
    }
    

    【讨论】:

    • 我也试过这个,但它也不起作用。问题是无论我使用moveItemAtPath还是deleteItemAtPath,路径上的文件都不会被删除。
    • 我在我的代码中发现了问题。只是我在某个地方启动了一个 NSTimer,它会每隔几秒钟保存一次文件,所以即使在删除之后,文件也会再次写入,给人的印象是它没有被删除。我接受这个答案,因为技术上是正确的。
    • 我建议您也使用您的逻辑添加 fileExistsAtPath。我注意到有时 isDeletableFileAtPath 在文件被删除/删除后仍然返回 true 一段时间,但 fileExistsAtPath 总是正确的。
    【解决方案2】:

    当你使用 NSFileManager 时,我只是想出了一些非常重要的事情。您必须了解 App Sandboxing。

    let documentDirectory = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]
    

    此行返回您的应用沙盒的路径文档目录。当您在文档目录中使用 FileManager 创建文件时(例如),不要保存完整的文件路径,而只保存当前文档目录的路径。

    您将能够重新创建已创建文件的完整路径。

    希望(5 年后)帮助开发人员 ;-)

    【讨论】:

      【解决方案3】:

      将其用于搜索路径并删除视频

      (NSString *)applicationDocumentsDirectory {
      
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
          NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
          return basePath;
          }
      NSString *dataFilePath = [[[self applicationDocumentsDirectory]
                                     stringByAppendingPathComponent:@"Data.nosync"]
                                    stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@.mp4",[dicForDelete valueForKey:keyVideoId],[dicForDelete valueForKey:keyVideoName]]];
      NSError *error;
      if ([[NSFileManager defaultManager] isDeletableFileAtPath:dataFilePath]) {
              BOOL success = [[NSFileManager defaultManager] removeItemAtPath:dataFilePath error:&error];
              if (success) {
                NSLog@"file deleted ");
              }else
              {
              NSLog@"file not deleted ");
              }
          }   
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。我仍然对修复工作的原因感到困惑,但值得一提的是,以防其他人可以解释。

        我发现[[NSFileManager defaultManager] removeItemAtURL:url error:&error] 在第一次尝试时会返回 false,但会出现 nil 错误。在第二次尝试时,它将返回 true。

        我的代码如下所示:

        // success == NO error = nil
        BOOL success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 
        
        // success == YES error = nil
        success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error];
        

        我发现如果我创建了自己的 NSFileManager 实例,它会在第一次尝试时工作。

        NSFileManager *fm = [[NSFileManager alloc] init];
        [fm removeItemAtURL:storeUrl error:&error];
        

        我在 iOS9 模拟器上运行。这闻起来像个虫子。我要归档雷达。

        【讨论】:

          猜你喜欢
          • 2013-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 2011-09-15
          • 2013-01-06
          • 2013-03-09
          相关资源
          最近更新 更多