51

I'm working on an app that uses the iPhone camera and after making several tests I've realised that it is storing all the captured videos on the tmp directory of the app. The captures don`t disappear even if the phone is restarted.

Is there any way to remove all these captures or is there any way to easily clean all cache and temp files?

tshepang
  • 12,111
  • 21
  • 91
  • 136
oniglo
  • 511
  • 1
  • 4
  • 3

9 Answers9

51

Yes. This method works well:

+ (void)clearTmpDirectory
{
    NSArray* tmpDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:NSTemporaryDirectory() error:NULL];
    for (NSString *file in tmpDirectory) {
        [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), file] error:NULL];
    }
}
Max Meier
  • 726
  • 9
  • 12
37

Swift 3 version as extension:

extension FileManager {
    func clearTmpDirectory() {
        do {
            let tmpDirectory = try contentsOfDirectory(atPath: NSTemporaryDirectory())
            try tmpDirectory.forEach {[unowned self] file in
                let path = String.init(format: "%@%@", NSTemporaryDirectory(), file)
                try self.removeItem(atPath: path)
            }
        } catch {
            print(error)
        }
    }
}

Example of usage:

FileManager.default.clearTmpDirectory()

Thanks to Max Maier, Swift 2 version:

func clearTmpDirectory() {
    do {
        let tmpDirectory = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(NSTemporaryDirectory())
        try tmpDirectory.forEach { file in
            let path = String.init(format: "%@%@", NSTemporaryDirectory(), file)
            try NSFileManager.defaultManager().removeItemAtPath(path)
        }
    } catch {
        print(error)
    }
}
Pang
  • 9,564
  • 146
  • 81
  • 122
Roman Barzyczak
  • 3,785
  • 1
  • 30
  • 44
28

Swift 4

One of the possible implementations

extension FileManager {
    func clearTmpDirectory() {
        do {
            let tmpDirURL = FileManager.default.temporaryDirectory
            let tmpDirectory = try contentsOfDirectory(atPath: tmpDirURL.path)
            try tmpDirectory.forEach { file in
                let fileUrl = tmpDirURL.appendingPathComponent(file)
                try removeItem(atPath: fileUrl.path)
            }
        } catch {
           //catch the error somehow
        }
    }
}
Vyacheslav
  • 26,359
  • 19
  • 112
  • 194
4

Try this code to remove NSTemporaryDirectory files

-(void)deleteTempData
{
    NSString *tmpDirectory = NSTemporaryDirectory();
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *cacheFiles = [fileManager contentsOfDirectoryAtPath:tmpDirectory error:&error];
    for (NSString *file in cacheFiles)
    {
        error = nil;
        [fileManager removeItemAtPath:[tmpDirectory stringByAppendingPathComponent:file] error:&error];
    }
}

and to check data remove or not write code in didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];

    NSString *tmpDirectory = NSTemporaryDirectory();
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *cacheFiles = [fileManager contentsOfDirectoryAtPath:tmpDirectory error:&error];
    NSLog(@"TempFile Count ::%lu",(unsigned long)cacheFiles.count);

    return YES;
}
Hardik Thakkar
  • 15,269
  • 2
  • 94
  • 81
4

Thanks to Max Maier and Roman Barzyczak. Updated to Swift 3, using URLs instead of strings.

Swift 3

func clearTmpDir(){

        var removed: Int = 0
        do {
            let tmpDirURL = URL(string: NSTemporaryDirectory())!
            let tmpFiles = try FileManager.default.contentsOfDirectory(at: tmpDirURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
            print("\(tmpFiles.count) temporary files found")
            for url in tmpFiles {
                removed += 1
                try FileManager.default.removeItem(at: url)
            }
            print("\(removed) temporary files removed")
        } catch {
            print(error)
            print("\(removed) temporary files removed")
        }
}
Jorge Ramírez
  • 657
  • 1
  • 7
  • 8
3

I know i'm late to the party but i'd like to drop my implementation which works straight on URLs, too:

let fileManager = FileManager.default
let temporaryDirectory = fileManager.temporaryDirectory
try? fileManager
    .contentsOfDirectory(at: temporaryDirectory, includingPropertiesForKeys: nil, options: .skipsSubdirectoryDescendants)
    .forEach { file in
        try? fileManager.removeItem(atPath: file.path)
    }
mbi
  • 581
  • 5
  • 13
2

This works on a jailbroken iPad, but I think this should work on a non-jailbroken device also.

-(void) clearCache
{
    for(int i=0; i< 100;i++)
    {
        NSLog(@"warning CLEAR CACHE--------");
    }
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError * error;
    NSArray * cacheFiles = [fileManager contentsOfDirectoryAtPath:NSTemporaryDirectory() error:&error];

    for(NSString * file in cacheFiles)
    {
        error=nil;
        NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:file ];
        NSLog(@"filePath to remove = %@",filePath);

        BOOL removed =[fileManager removeItemAtPath:filePath error:&error];
        if(removed ==NO)
        {
            NSLog(@"removed ==NO");
        }
        if(error)
        {
            NSLog(@"%@", [error description]);
        }
    }
}
Pang
  • 9,564
  • 146
  • 81
  • 122
user1105951
  • 2,259
  • 2
  • 34
  • 55
  • To let you know I tried this on an non-jailbroken iphone ios6, works great. Thanks. – TMan Mar 03 '13 at 23:57
0
//
//  FileManager+removeContentsOfTemporaryDirectory.swift
//
//  Created by _ _ on _._.202_.
//  Copyright © 202_ _ _. All rights reserved.
//

import Foundation

public extension FileManager {

    /// Perform this method on a background thread.
    /// Returns `true` if :
    ///     * all temporary folder files have been deleted.
    ///     * the temporary folder is empty.
    /// Returns `false` if :
    ///     * some temporary folder files have not been deleted.
    /// Error handling:
    ///     * Throws `contentsOfDirectory` directory access error.
    ///     * Ignores single file `removeItem` errors.
    ///
    @discardableResult
    func removeContentsOfTemporaryDirectory() throws -> Bool  {
        
        if Thread.isMainThread {
            let mainThreadWarningMessage = "\(#file) - \(#function) executed on main thread. Do not block the main thread."
            assertionFailure(mainThreadWarningMessage)
        }
        
        do {
            
            let tmpDirURL = FileManager.default.temporaryDirectory
            let tmpDirectoryContent = try contentsOfDirectory(atPath: tmpDirURL.path)
            
            guard tmpDirectoryContent.count != 0 else { return true }
            
            for tmpFilePath in tmpDirectoryContent {
                let trashFileURL = tmpDirURL.appendingPathComponent(tmpFilePath)
                try removeItem(atPath: trashFileURL.path)
            }
            
            let tmpDirectoryContentAfterDeletion = try contentsOfDirectory(atPath: tmpDirURL.path)
            
            return tmpDirectoryContentAfterDeletion.count == 0
            
        } catch let directoryAccessError {
            throw directoryAccessError
        }
        
    }
}
Darkwonder
  • 1,149
  • 1
  • 13
  • 26
0

Use this dedicated code to remove all tmp files:

let directory = FileManager.default.temporaryDirectory
try contentsOfDirectory(at: directory, includingPropertiesForKeys: []).forEach(removeItem)

You filter the contents before performing the forEach if you need

Mojtaba Hosseini
  • 95,414
  • 31
  • 268
  • 278