我正在尝试使用NSFileManager从目录中删除特定文件。我想忽略目录中隐藏的.DS_Store和Icon文件(我正在检查的文件夹必须有一个自定义图标),但我也不小心删除了它们。现在,我正在做以下事情:
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *dirContents = [manager contentsOfDirectoryAtPath:[selectedFolder stringValue] error:nil];
for (int i = 0; i < [dirContents count]; i++)
{
NSString *theFile = [dirContents objectAtIndex:i];
if([theFile isEqualToString:@".DS_Store"] || [theFile isEqualToString:@"Icon?"] || [theFile isEqualToString:@"Icon"])
{
continue;
}
//do manipulations on files here
}
[manager release];
但是,我的if语句中没有匹配.DS_Store和Icon文件。此外,当我在Finder中显示隐藏文件时,图标文件称为“图标”。但是,在终端的该目录中执行ls打印出“Icon?”。
如何在我的代码中正确解析这些文件?
由于
修改 所以它实际上是成功忽略.DS_Store文件,但Icon文件仍然超过了if语句。
答案 0 :(得分:24)
有趣的是,我相信another question posted recently的问题部分基本上可以回答你的问题。如果您使用:
-[NSFileManager contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:]
(doc link),您可以传递一个选项NSDirectoryEnumerationSkipsHiddenFiles
来忽略隐藏文件,这样您就不必检查特定的文件:
NSURL * selectedFolderURL = [NSURL fileURLWithPath:[selectedFolder stringValue]];
[myFileManager contentsOfDirectoryAtURL:selectedFolderURL
includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
请注意,这会返回绝对网址,而您问题中的方法会将 relative 的路径返回到原始目录。很容易解决,但重要的是要知道,如果你删除的东西。
答案 1 :(得分:3)
文件夹的自定义图标资源的文件名为“Icon\r
”(Icon
,后跟回车符)。
在枚举我想要跳过不可见项目的目录(名称以“。”开头的那些目录)时,我通常会做的是检查前缀为“”。“:
NSMutableArray *fullPaths = [NSMutableArray array];
NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
NSArray *subpaths = [fileManager subpathsAtPath:filePath];
for (NSString *subpath in subpaths) {
if ( ![[subpath lastPathComponent] hasPrefix:@"."] &&
![[subpath lastPathComponent] isEqualToString:@"Icon\r"]) {
[fullPaths addObject:[filePath stringByAppendingPathComponent:subpath]];
}
}
// continue
以上代码适用于10.5及更高版本(或者甚至10.0,我相信,如果您更改了快速枚举以使用NSEnumerator
)。
P.S。如果您使用NSFileManager
创建+defaultManager
,则不应使用[manager release]
行,因为这会过度释放。
所以,而不是:
NSFileManager *manager = [NSFileManager defaultManager];
//
[manager release];
DO
NSFileManager *manager = [[NSFileManager alloc] init];
//
[manager release];
或
NSFileManager *manager = [NSFileManager defaultManager];
//
答案 2 :(得分:-1)
简单方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *imageFilenames = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
for (int i = 0; i < [imageFilenames count]; i++)
{
NSString *imageName = [NSString stringWithFormat:@"%@/%@",documentsDirectory,[imageFilenames objectAtIndex:i] ];
if (![[imageFilenames objectAtIndex:i]isEqualToString:@".DS_Store"])
{
UIImage *myimage = [UIImage imageWithContentsOfFile:imageName];
UIImageView *imageView = [[UIImageView alloc] initWithImage:_myimage];
}
}