简体   繁体   中英

Deleting files from local app Documents folder

So far I have managed to delete rows from my table view but it won't update in the given Documents folder. How would I achieve this? Below is the code I'm using.

I tried to implement the code from here How to delete files from a folder which is placed in documents folder .

My goal is to have the ability to delete any file, not just a desired file.

Thanks in advance.

#import "Documents.h"

@interface DocumentsViewController ()

@end

@implementation DocumentsViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    self.navigationItem.rightBarButtonItem = self.editButtonItem;


    NSString *temp = [[NSBundle mainBundle] resourcePath];
    self.directoryPath = [temp stringByAppendingPathComponent:@"Documents"];

    [self.tableView setEditing:NO animated:YES];



}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [directoryContents count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"Cell";


        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }

        // Configure the cell.
        cell.textLabel.text = [directoryContents objectAtIndex:indexPath.row];

        return cell;
}


-(NSString*)directoryPath{
    return directoryPath;
}

-(void)setDirectoryPath:(NSString*)a{
    [a retain];
    [directoryPath release];
    directoryPath = a;
    [self loadDirectoryContents];
    [table reloadData];
}

-(void)loadDirectoryContents{
    [directoryContents release];
    directoryContents = [[NSFileManager defaultManager] directoryContentsAtPath: directoryPath];
    [directoryContents retain];
}

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { //implement the delegate method

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Update data source array here, something like [array removeObjectAtIndex:indexPath.row];
        [directoryContents removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView reloadData];


        NSString *extension = @"png";
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];

        NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
        NSEnumerator *e = [contents objectEnumerator];
        NSString *filename;
        while ((filename = [e nextObject])) {

            if ([[filename pathExtension] isEqualToString:extension]) {

                [fileManager removeItemAtPath:[documentsDirectory     stringByAppendingPathComponent:filename] error:NULL];
            }
        }

    }
}


#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}

-(void)dealloc{
    [super dealloc];    
    [directoryContents release];
    directoryContents = nil;
    self.directoryPath = nil;
    [table release];
    table = nil;

}

@end

WORKING CODE FOR ME:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if (editingStyle == UITableViewCellEditingStyleDelete){

        NSString *fileName = [directoryContents objectAtIndex:indexPath.row];

        NSString *path;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"downloads"];
        path = [path stringByAppendingPathComponent:fileName];
        NSError *error;

    //Remove cell
        [directoryContents removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
        [tableView reloadData];

        if ([[NSFileManager defaultManager] fileExistsAtPath:path])     //Does file exist?
        {
            if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error])   //Delete it
            {
                NSLog(@"Delete file error: %@", error);
            }
        }
    }
}

NSFileManager is very useful in removing files:

 [[NSFileManager defaultManager] removeItemAtPath: pathToFile error: &error];

Also take a look at this article it has some useful codes. Although a bit old but the codes works just fine.

http://iphonedevsdk.com/forum/iphone-sdk-development/3576-how-do-i-delete-a-file-in-my-documents-directory.html

Here is some more code example

// Get the Documents directory path 
NSString *temPath = [NSString stringWithFormat:@"%@%d",@"Documents/Media_",  Key_mediaID];
//This temPath look line ../../../Documents/Media_1

  NSString *documentsDirectoryPath = [NSHomeDirectory()  stringByAppendingPathComponent:temPath]; 

// Delete the file using NSFileManager
 NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:[documentsDirectoryPath   stringByAppendingPathComponent:Your File Name] error:nil];

Here is another link with some more helpful code

http://ios.biomsoft.com/2012/01/17/delete-all-files-in-documents-directory/

Hope this helps you out.

Edit:

To remove a files with specific extension say for example jpg you can try the following

    NSString *extension = @"jpg";
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];  
    NSEnumerator *e = [contents objectEnumerator];
    NSString *filename;
    while ((filename = [e nextObject])) {

    if ([[filename pathExtension] isEqualToString:extension]) {

    [fileManager removeItemAtPath:[documentsDirectory     stringByAppendingPathComponent:filename] error:NULL];
   }
   }

In addition to the above if you know the path to the file you want to delete the following is a useful code:

// Get the Documents directory path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES); 
NSString *documentsDirectoryPath = [paths objectAtIndex:0];

// Delete the file using NSFileManager
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:[documentsDirectoryPath stringByAppendingPathComponent:yourFile.txt] error:nil];

Edit 2:

To delete the document in a specific folder:

NSError *error;
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *documents= [documentsDirectory  stringByAppendingPathComponent:@"YourFolder"];
NSString *filePath = [documents stringByAppendingPathComponent:@"file2.txt"];
[fileMgr removeItemAtPath:filePath error:&error]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM