Cocoa - NSFileManager removeItemAtPath不工作

时间:2011-01-07 02:23:31

标签: objective-c cocoa xcode macos nsfilemanager

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

"text.txt" could not be removed

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

编辑:

这就是我正在使用的:

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

谢谢,

凯文

6 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

我在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)

答案 2 :(得分:2)

首先,您需要选择文档目录的路径,然后才能删除该文件。 只删除声明是不够的。

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

用它来解决你的问题。

答案 3 :(得分:2)

您的路径不正确

使用以下

NSString *str = [outputFieldURL path];

而不是

NSString *str = [outputFieldURL absoluteString];

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

答案 4 :(得分:0)

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

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

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

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

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

答案 5 :(得分:0)

默认方法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;
}