【问题标题】:unable to omit @".DS_Store" file while fetching contents of Document Drectory在获取文档目录的内容时无法省略 @".DS_Store" 文件
【发布时间】:2012-12-11 18:41:42
【问题描述】:

我正在将音频文件列表存储到我的文档目录中,然后获取它们。

它给了我一个音频文件列表,同时它给了我一个名为@".DS_Store"的文件。在获取内容时,我想离开这个文件目录。

在获取音频列表时,除了从数组中删除它或应用@".DS_Store" 检查之外,我还有什么办法可以摆脱它。

这究竟是什么原因。?

#pragma mark - Saving Audio in Document Directory
-(void)saveAudioinDocumentDirectory:(ASIHTTPRequest *)theRequest
{
    /*save the Audio file in Document Directory */
    NSFileManager *fileManager=[NSFileManager defaultManager];

    NSLog(@"GOT THE SIZe OF AUDIO %d",[[theRequest responseData] length]);
    NSLog(@"AUDIO ID IS %@",[[theRequest userInfo] valueForKey:@"audioIndex"]);

    /*Get the Path  to Application Documents Directory*/
    NSArray *docDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    /*append the neccessary file extension */

    NSString *filepathStr=[NSString stringWithFormat:@"/%@/%@.mp3",docDir,[NSString stringWithFormat:@"%@",[[theRequest userInfo] valueForKey:@"audioIndex"]]];

    /*Check if my crrent file exists in the Documents Directory*/

    if(![fileManager fileExistsAtPath:filepathStr])
    {
        /* file doesnt exists */

        /*create a NSdata of File*/
        NSData *data=[NSData dataWithData:[theRequest responseData]];
        NSLog(@"%@",filepathStr);

        if ([data length] >0 ){


            /*write the File at the Location in Documents Directory */

            [data writeToFile:filepathStr atomically:YES];
            NSLog(@"Successfully saved the file to %@", filepathStr);
        }
        else if([data length] == 0)
        {
            NSLog(@"Nothing was downloaded.");
        }

    }
    /*After saving fetch the path til documents Directory*/
    NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    /*Get the Path for Files */
    NSString *s=[folders objectAtIndex:0];

    /*Fetch the list of Files stored in Documents Directory*/

    NSArray *contents = [fileManager contentsOfDirectoryAtPath:s error:NULL];
    NSLog(@"TOTAL NUMBER OF AUDIO FILES %d %@",[contents count],[contents objectAtIndex:0]);

    if([Audiolistforstr isEqualToString:@"AudioListForIntro"])
    {

        //  NSLog(@"Audiolistforstr@"IntroThirdRow"  in reading audio  from document Intro IS %@",Audiolistforstr);

        /*Intro*/
        [AudioListArrForIntro removeAllObjects];
        [AudioListArrForIntro addObjectsFromArray:contents];
        if([AudioListArrForIntro containsObject:@".DS_Store"])
        {
            [AudioListArrForIntro removeObject:@".DS_Store"];

        }
        NSLog(@"FINAL LIST %@",AudioListArrForIntro);

    }
    else if([Audiolistforstr isEqualToString:@"AudioListForCredits"])
    {

        //  NSLog(@"Audiolistforstr@"IntroThirdRow"  in reading audio  from document credit IS %@",Audiolistforstr);

        /*credits*/
        [AudioListArrForCredits removeAllObjects];
        [AudioListArrForCredits addObjectsFromArray:contents];
        if([AudioListArrForCredits containsObject:@".DS_Store"])
        {
            [AudioListArrForCredits removeObject:@".DS_Store"];

        }
    NSLog(@"FINAL LIST %@",AudioListArrForCredits);

    }


    /* Did we find anything? */
    if([Audiolistforstr isEqualToString:@"AudioListForIntro"])
    {

        //  NSLog(@"Audiolistforstr@"IntroThirdRow"  in reading audio  fromRELOADNG TABLE Intro IS %@",Audiolistforstr);

        /*Intro*/
        if ([AudioListArrForIntro count] == 0)
        {

        }
        else
        {
            UIView *vw=(UIView *)[self.view viewWithTag:ViewAddAudioIntroTag];
            [(UITableView *)[vw viewWithTag:tblIntroAudioListTag] reloadData];
        }
    }
    else if([Audiolistforstr isEqualToString:@"AudioListForCredits"])
    {
        //  NSLog(@"Audiolistforstr@"IntroThirdRow"  in reading audio  fromRELOADNG TABLE Intro IS %@",Audiolistforstr);

        /*Credits*/
        if ([AudioListArrForCredits count] == 0)
        {
        }

        else
        {

            /*AudioListForCredits*/

            UIView *vw=(UIView *)[self.view viewWithTag:ViewAddAudioCreditsTag];
            [(UITableView *)[vw viewWithTag:tblCreditsAudioListTag] reloadData];
        }

    }

}

任何帮助将不胜感激。

谢谢 维卡斯

【问题讨论】:

  • @Reddy 对此有什么想法吗?

标签: iphone xcode nsdocumentdirectory


【解决方案1】:

你可以在NSArray *docDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];这一行之后检查.DS_Store......即,

NSMutableArray * dirContents = [[NSMutableArray alloc] initWithArray:docDir];
if([docDir containsObject:@".DS_Store"])
{
    [dirContents removeObject:@".DS_Store"];
}

由此,dirContents 删除了 .DS_Store 的条目。

【讨论】:

  • 任何其他方法而不是使用这个
  • 我在这种方法上取得了成功,所以我没有尝试另一种方法。我认为这可能是您问题的解决方案。因为这将从您的数组中删除.DS_Store 的条目,您可以使用其余对象。
【解决方案2】:

过滤您的文档目录内容。例如,如果您有扩展名为 .mp3 的音频文件,那么您可以获取所有 mp3 文件,如下所示:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:NULL];

directoryContent = [directoryContent filteredArrayUsingPredicate:
                                            [NSPredicate predicateWithFormat:@"pathExtension ==[c] %@", @"mp3"]];

这将忽略除 mp3 文件之外的所有其他文件。 万事如意!!!

【讨论】:

  • 完美的解决方案来获取文件并省略不必要的文件。
【解决方案3】:

您正在使用的 API:

NSArray *contents = [fileManager contentsOfDirectoryAtPath:s error:NULL];

返回在路径中找到的所有个文件,其中包括the ".DS_Store" file

我建议将“contents”分配给可变数组,例如:

NSMutableArray * contents = 
    [[NSMutableArray alloc] initWithArray: [fileManager contentsOfDirectoryAtPath:s error:NULL]];` 

并遍历数组以查找并删除任何和所有没有“.mp3”作为路径扩展名的文件。

我还建议不要以大写字母开头任何变量(例如,不要使用“Audiolistforstr”,而是使用“audiolistforstr”或更好的“arrayofAudioFiles”)。 Objective C 的最佳实践是以小写字母开头的所有变量和方法。

【讨论】:

  • 大家好,感谢您的支持,我遵循了您的方法并使其正常工作,但我想在从文档目录中获取数据时是否有任何内置方法来提取此类文件
【解决方案4】:

它运行良好..

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多