Objective c 使用文件管理器忽略文件夹中的.DS_存储和图标文件
我正在尝试使用NSFileManager从目录中删除特定文件。我想忽略目录中隐藏的.DS_存储和图标文件(我正在检查的文件夹必须有一个自定义图标),但是我一直不小心删除它们。现在,我正在做以下工作:Objective c 使用文件管理器忽略文件夹中的.DS_存储和图标文件,objective-c,cocoa,parsing,icons,nsfilemanager,Objective C,Cocoa,Parsing,Icons,Nsfilemanager,我正在尝试使用NSFileManager从目录中删除特定文件。我想忽略目录中隐藏的.DS_存储和图标文件(我正在检查的文件夹必须有一个自定义图标),但是我一直不小心删除它们。现在,我正在做以下工作: NSFileManager *manager = [NSFileManager defaultManager]; NSArray *dirContents = [manager contentsOfDirectoryAtPath:[selectedFolder stringValue] erro
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];
NSFileManager*manager=[NSFileManager defaultManager];
NSArray*dirContents=[manager contentsOfDirectoryAtPath:[selectedFolder stringValue]错误:nil];
对于(int i=0;i<[dirContents count];i++)
{
NSString*theFile=[dirContents objectAtIndex:i];
如果([theFile isEqualToString:@.DS_Store”]| |[theFile isEqualToString:@“Icon?”]|[theFile isEqualToString:@“Icon”])
{
继续;
}
//在这里对文件进行操作
}
[经理释放];
但是,.DS_存储和图标文件在我的if语句中不匹配。此外,当我在Finder中显示隐藏文件时,图标文件称为“图标”。但是,在终端中的目录中执行ls会打印出“Icon?”
如何在代码中正确解析这些文件
谢谢
编辑:
因此它实际上成功地忽略了.DS_存储文件,但图标文件仍然通过了if语句。有趣的是,我相信问题部分基本上回答了您的问题。如果您使用:
-[NSFileManager contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:]
(),您可以传递一个选项,NSDirectoryEnumerationSkipsHiddenFiles
,以忽略隐藏的文件,从而不必检查特定的文件:
NSURL * selectedFolderURL = [NSURL fileURLWithPath:[selectedFolder stringValue]];
[myFileManager contentsOfDirectoryAtURL:selectedFolderURL
includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
请注意,这将返回绝对URL,而问题中的方法返回相对于原始目录的路径。轻松解决,但要知道这一点很重要,尤其是在删除内容时。文件夹自定义图标资源的文件名是“
图标\r
”(图标,后跟回车符)
在枚举要跳过不可见项(名称以“.”开头的项)的目录时,我通常会检查前缀@“
上述代码将在10.5及更高版本中使用(我相信,如果您将快速枚举更改为使用nsemulator
,甚至10.0)
注意:如果您正在使用+defaultManager
创建NSFileManager
,则不应使用[manager release]
行,因为这会导致发布过度
因此,不是:
NSFileManager *manager = [NSFileManager defaultManager];
//
[manager release];
做
或
简单方法:
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];
}
}
NSArray*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory=[paths objectAtIndex:0];
NSFileManager*manager=[NSFileManager defaultManager];
NSArray*imageFilenames=[manager内容目录路径:文档目录错误:nil];
对于(int i=0;i<[imageFilenames计数];i++)
{
NSString*imageName=[NSString stringWithFormat:@“%@/%@”,文档目录[IMAGEFILENAME objectAtIndex:i]];
如果(![[imageFilenames objectAtIndex:i]IsequalString:@“.DS_Store”])
{
UIImage*myimage=[UIImage imageWithContentsOfFile:imageName];
UIImageView*imageView=[[UIImageView alloc]initWithImage:_myimage];
}
}
如果您写入NSLog(@“%@”,文件)代码>设置文件后,这些图标文件名是否显示得与您在该中测试的文件名完全相同。可以肯定的是,您在终端中看到的?
实际上不是ASCII?
这是不必要的,并且对于OP的要求可能是危险的。首先,子路径路径:
(其用法是(请参阅“特殊注意事项”))在子目录上递归,这意味着这可能会生成不在原始目录中的文件。此外,NSFileManager
将使用NSDirectoryEnumerationSkipsHiddenFiles
跳过不可见文件,并可以使用EnumeratorUrl:includingPropertiesForKeys:options:errorHandler:
为目录内容提供枚举器,如果您需要的话(注意,这也会递归)。一句话:不是每个隐藏文件都有一个以
开头的名称,例如SetFile-a V/path/to/file
。此方法返回文件URL而不是文件路径,因此需要对代码进行额外修改。[theURL路径]
似乎有点太明显了,不必提及。我知道;)在任何情况下,使用URL而不是路径似乎是当今更现代的推荐方式;基于路径的API在某些地方更受限制。URL肯定更强大。但我想说的是,除了从NSString到NSURL的更改之外,旧方法还返回一个相对于目录路径的文件名数组;新的返回完整(绝对)URL。那咬了我一口,直到我发现。
NSFileManager *manager = [[NSFileManager alloc] init];
//
[manager release];
NSFileManager *manager = [NSFileManager defaultManager];
//
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];
}
}