Deleting all the files in the iPhone sandbox (documents folder)?

前端 未结 7 2062
清歌不尽
清歌不尽 2020-11-28 05:50

Is there an easy way to delete all the files(images) I saved in the documents folder of the app?

相关标签:
7条回答
  • 2020-11-28 06:31

    Code did not work with IOS 7 and Xcode 5 so edited to work with my app. Big credits to @Ole Begemann and @pablasso.

    -(void)EmptySandbox
    {
        NSFileManager *fileMgr = [[NSFileManager alloc] init];
        NSError *error = nil;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSArray *files = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:nil];
    
        while (files.count > 0) {
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error];
            if (error == nil) {
                for (NSString *path in directoryContents) {
                    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:path];
                    BOOL removeSuccess = [fileMgr removeItemAtPath:fullPath error:&error];
                    files = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:nil];
                    if (!removeSuccess) {
                        // Error
                    }
                }
            } else {
                // Error
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 06:33

    Swift 2.1 with some extra's:

    do {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentsDirectory = paths[0]
        let documentsDirectoryURL = NSURL(fileURLWithPath: paths[0])
    
        let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentsDirectory)
    
        var totalMegaBytes: Double = 0
        var nrOfFiles = 0
    
        for filename in directoryContents {
            let file = documentsDirectoryURL.URLByAppendingPathComponent(filename)
    
    
            let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(file.path!)
            let fileSize = fileAttributes[NSFileSize] as! Double            
            totalMegaBytes += fileSize/1024/1024
    
            do {
                try NSFileManager.defaultManager().removeItemAtURL(file)
                nrOfFiles++
            }catch let error as NSError{
                print("> Emptying sandbox: could not delete file", filename, error)
            }
        }
    
        print("> Emptying sandbox: Removed \(nrOfFiles) files with a total of \(round(totalMegaBytes))MB")
    
    }catch let error as NSError{
        print("> Emptying sandbox: Error emptying sandbox", error)
    }
    
    0 讨论(0)
  • 2020-11-28 06:34

    It may not be applicable in all cases but generally it would be more efficient to put all the files in a custom directory inside Documents Directory and then use removeItemAtPath:error: to delete that directory and create it again. E.g.:

    // Clear cache
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:cacheDirectory error:&error];
    if (error)
    {
        // error handling
    }
    
    // Create cache directory again
    NSError *error2;
    [[NSFileManager defaultManager] createDirectoryAtPath:cacheDirectory withIntermediateDirectories:YES attributes:nil error:&error2];
    if (error2)
    {
        // error handling
    }
    
    0 讨论(0)
  • 2020-11-28 06:39
    - (void)removeFile
    {
        // you need to write a function to get to that directory
        NSString *filePath = [self getDirectory];
        NSFileManager *fileManager = [NSFileManager defaultManager];  
        if ([fileManager fileExistsAtPath:filePath]) 
        {
            NSError *error;
            if (![fileManager removeItemAtPath:filePath error:&error])
            {
                NSLog(@"Error removing file: %@", error); 
            };
        }
    }
    

    I believe this is shorter.

    0 讨论(0)
  • 2020-11-28 06:45
    NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
    NSError *error = nil;
    NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error];
    if (error == nil) {
        for (NSString *path in directoryContents) {
            NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:path];
            BOOL removeSuccess = [fileMgr removeItemAtPath:fullPath error:&error];
            if (!removeSuccess) {
                // Error handling
                ...
            }
        }
    } else {
        // Error handling
        ...
    }
    
    0 讨论(0)
  • 2020-11-28 06:49

    For Swift devs:

    let fileMgr = NSFileManager()
    let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
    if let directoryContents = try? fileMgr.contentsOfDirectoryAtPath(dirPath)
    {
        for path in directoryContents 
        {   
            let fullPath = (dirPath as NSString).stringByAppendingPathComponent(path)
            do 
            {
                try fileMgr.removeItem(atPath: fullPath)
                print("Files deleted")
            } 
            catch let error as NSError 
            {
                print("Error deleting: \(error.localizedDescription)")
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题