Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用文件管理器忽略文件夹中的.DS_存储和图标文件_Objective C_Cocoa_Parsing_Icons_Nsfilemanager - Fatal编程技术网

Objective c 使用文件管理器忽略文件夹中的.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从目录中删除特定文件。我想忽略目录中隐藏的.DS_存储和图标文件(我正在检查的文件夹必须有一个自定义图标),但是我一直不小心删除它们。现在,我正在做以下工作:

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