从本地应用程序文档文件夹中删除文件

Posted

技术标签:

【中文标题】从本地应用程序文档文件夹中删除文件【英文标题】:Deleting files from local app Documents folder 【发布时间】:2013-06-06 01:57:27 【问题描述】:

到目前为止,我已经设法从表格视图中删除了行,但它不会在给定的 Documents 文件夹中更新。我将如何实现这一目标?下面是我正在使用的代码。

我尝试从这里实现代码How to delete files from a folder which is placed in documents folder。

我的目标是能够删除任何文件,而不仅仅是想要的文件。

提前致谢。

#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

我的工作代码:

- (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);
            
        
    

【问题讨论】:

这里有什么问题? 问题是在我的表格视图中滑动删除时,它会删除该行,但不会删除文件夹中的实际文件。所以刷新我的表格视图会再次显示文件。 您发布的代码试图删除Documents 文件夹下的整个directoryPath 文件夹。您应该附加实际的文件名,而不仅仅是一个空字符串。它还有助于检查removeItemAtPath 的返回值。它返回 NO 然后记录 error 值,以便您查看实际问题。 就是这样,我不希望将其绑定到特定文件中。表中删除的行响应 Documents 文件夹。但是文件夹不会随着删除而更新。 尝试在我创建的代码 sn-p 中将 jpg 更改为 png,看看是否可以删除 png 文件。 【参考方案1】:

NSFileManager 在删除文件时非常有用:

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

还可以看看这篇文章,它有一些有用的代码。虽然有点旧,但代码工作得很好。

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

这里有更多代码示例

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

这是另一个链接,其中包含一些更有用的代码

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

希望对你有所帮助。

编辑:

要删除具有特定扩展名的文件,例如 jpg,您可以尝试以下操作

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

如果您知道要删除的文件的路径,除了上述之外,以下是一个有用的代码:

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

编辑 2:

删除特定文件夹中的文档:

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]

【讨论】:

对我来说这一行:stringByAppendingPathComponent:Your File Name,表示我想删除一个特定的命名文件。我正在努力避免这种情况。 然后尝试删除我答案最底部目录中所有文件的链接。 仍然不会更新文件夹。原始帖子更新了我的整个 .m 文件,以便更好地参考。 如果我没记错的话,你想删除扩展名为 png 的文件,你为什么不试试我为 jpg 提供的代码 sn-p 并将其更改为 png 呢?它可能会成功。 我就是这么做的。相同的代码,不同的扩展类型。

以上是关于从本地应用程序文档文件夹中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

删除支持 iCloud 的文件夹中包含文档的 iOS 应用程序

从应用程序的文档目录加载本地 html 文件 swift wkwebview

WKWebView 确实从本地文档文件夹加载资源

如何从 iPhone 的文档目录中删除超过两天的文件

基于 React 的文件管理器,从浏览器/本地主机中删除本地文件

Swift 从特定文档目录位置删除所有文件