从本地应用程序文档文件夹中删除文件
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