【问题标题】:Cocoa - NSFileManager removeItemAtPath Not Working可可 - NSFileManager removeItemAtPath 不工作
【发布时间】:2011-06-05 01:16:22
【问题描述】:

我试图删除一个文件,但不知何故 nsfilemanager 不允许我这样做。我确实在一行代码中使用了该文件,但是一旦运行了该操作,我希望删除该文件。我已经记录了错误代码和消息,我得到错误代码:4 和消息:

"text.txt" could not be removed

有没有办法“干净”地修复这个错误(没有任何黑客),以便苹果在他们的 Mac App Store 上接受这个应用程序?

编辑:

这是我正在使用的:

[[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];

谢谢,

凯文

【问题讨论】:

  • 嗨,Kevin,您能否发布更多代码,以便我们了解发生了什么?另外,这与您需要 BLAuthentication 的应用程序相同吗?
  • 哇,很有趣,我们又在同一个问题上遇到了,嗯?没有什么不同,在这一个中,我将其提交到 App Store,在这种情况下,他们不允许“root 访问”。我已对问题进行了更改,以包括我正在使用的内容。
  • 尝试使用unlink([filePath fileSystemRepresentation]);,这是删除文件的 POSIX 方式。
  • 我应该说它会减少文件的链接计数(这可能会导致删除)。请参阅unlink 页面。我仍然不确定它是否会有所作为。
  • 凯文,好的,确定一下。我要指出这一点,以防万一。另外,作为一般建议,让您的代码看起来像这样并告诉我们它打印出来的内容:NSError *error; [[NSFileManager defaultMAnager] removeItemAtPath:filePath error:&error]; NSLog(@"%@", error);

标签: objective-c cocoa xcode macos nsfilemanager


【解决方案1】:

错误代码 4 似乎是 NSNoSuchFileError。如果您要删除的文件确实存在,那么您的路径错误。如果您希望我们准确地告诉您路径错误的原因,您需要发布一些代码。

如果文件不存在,可以忽略错误。

【讨论】:

  • 您好我遇到了这个问题,原来我的文件名是错误的。所以文件名错误或文件路径错误,它会给出错误代码4。干杯。
  • @Rocotilos:“文件路径”通常包含文件的实际名称。
  • 您一般如何在文档/源代码中查找实际错误?
  • @fabian789 在这种情况下,我输入了以下 Google 搜索 nserror codes site:developer.apple.com
【解决方案2】:

我在 swift 中遇到了类似的问题。由于某种原因 fileManager.removeItemAtPath 不起作用,我将 fileManager.removeItemAtPath(filePath) 更改为 fileManager.removeItemAtURL(fileURL) 并且它工作正常。

    let fileManager = NSFileManager()
    let documentsFolderUrl = fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil)

    let soundURL = documentsFolderUrl!.URLByAppendingPathComponent(recording.path)
    let stringTrimmedFilePath = "trimmed_\(recording.path)"
    let trimmedSoundURL = documentsFolderUrl!.URLByAppendingPathComponent(stringTrimmedFilePath)
    var error: NSError?
    fileManager.removeItemAtURL(trimmedSoundURL, error: &error)

【讨论】:

  • 似乎是 fileManager.removeItemAtPath 的错误
【解决方案3】:

首先您需要选择文档目录的路径,然后您可以删除该文件。 仅删除语句是不够的。

   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectoryPath = [paths objectAtIndex:0];

    NSString *databaseFile = [documentsDirectoryPath stringByAppendingPathComponent:@"text.txt"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:databaseFile error:NULL];

用它来解决你的问题。

【讨论】:

    【解决方案4】:

    你的路径不正确

    使用下面的

    NSString *str = [outputFieldURL path];
    

    而不是

    NSString *str = [outputFieldURL absoluteString];
    

    “removeItemAtPath:”方法需要文件的本地路径,如果要使用url删除,则应使用-removeItemAtURL:

    【讨论】:

    • 对于那些正在寻找有关代码的答案的人:使用任何“路径”系列函数时出现 4 个错误,这是首先要检查的事情。如果您使用 NSURL absoluteString,它将在前面加上“file:///”,这将导致此错误。
    【解决方案5】:

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

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

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

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

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

    【讨论】:

      【解决方案6】:

      默认方法 AFNetworking 3.0 不会刷新您下载的文件。

      如果你想在 Objective-C +iOS9.0 中重写这个文件,你需要这样做:

      - (NSURLSessionDownloadTask *) downloadDocsFromUrl:(NSString *) url withSuccesBlock:(DocModelBlock) docModelBlock withErrorBlock:(ErrorBlock) errorBlock {
      
          NSURL *URL = [NSURL URLWithString:url];
          NSURLRequest *request = [NSURLRequest requestWithURL:URL];
      
          NSURLSessionDownloadTask *downloadTask = [self.sessionManager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
      
              NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
              NSFileManager *fileManager = [NSFileManager defaultManager];
              NSError *error;
      
              NSURL *documentsDirectoryURL = [fileManager URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:&error];
      
              if ([httpResponse statusCode] == 200) {
                  NSURL *urlPath = [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
      
                  if ([fileManager fileExistsAtPath:urlPath.path]) {
                      [fileManager removeItemAtPath:urlPath.path error:&error];
                  }
              }
      
              return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
          } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
              if (error) {
                  errorBlock(error);
              } else {
                  docModelBlock(filePath);
              }
          }];
          [downloadTask resume];
      
          return downloadTask;
      }
      

      【讨论】:

      • 你能提供更多的上下文吗?为什么你认为这解决了一个七年前的问题?对我来说,它看起来像很多代码,如果我遇到与 OP 相同的问题,我不知道我需要哪些部分
      猜你喜欢
      • 2012-01-23
      • 2023-04-01
      • 2013-01-06
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多