【问题标题】:iphone - how to check if the file is a directory , audio , video or image?iphone - 如何检查文件是目录、音频、视频还是图像?
【发布时间】:2013-06-13 07:23:32
【问题描述】:

按照我的程序显示 Documents 目录的内容并显示在 tableView 中。 但 Documents 目录包含一些目录、一些音频、一些视频和一些图像等。

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
fileType = @"" ;
NSString *subDirectoryPath = [docsDir stringByAppendingPathComponent:fileType];
NSLog(@"path : %@",subDirectoryPath);
files  = [[NSMutableArray alloc] initWithArray:[[NSFileManager defaultManager] contentsOfDirectoryAtPath:subDirectoryPath error:nil]];
NSLog(@"files ::::: %@ ",[files description]);

所以,我想检查文件是否是目录,然后它的目录图像可以显示在单元格的 imageView 中。音频、视频和图像也一样。

我在 NSFileManager classReference 中进行了搜索,但得到了解决方案。

怎么做?

【问题讨论】:

标签: iphone ios nsfilemanager


【解决方案1】:

示例代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *directory = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory];
BOOL isDirectory;
for (NSString *item in directory){
    BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:item isDirectory:&isDirectory];
    if (fileExistsAtPath) {
       if (isDirectory)
       {
           //It's a Directory.
       }
    }
    if ([[item pathExtension] isEqualToString:@"png"]) {
       //This is Image File with .png Extension
    }
}

您也可以使用Uniform Type Identifiers,如Bavarious here 所述。

示例代码:

NSString *file = @"…"; // path to some file
CFStringRef fileExtension = (CFStringRef) [file pathExtension];
CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

if (UTTypeConformsTo(fileUTI, kUTTypeImage)) NSLog(@"It's an image");
else if (UTTypeConformsTo(fileUTI, kUTTypeMovie)) NSLog(@"It's a movie");
else if (UTTypeConformsTo(fileUTI, kUTTypeText)) NSLog(@"It's text");

CFRelease(fileUTI);

【讨论】:

  • 如果没有扩展名就是文件夹
  • 如果音频文件...vin...怎么办?因为有多个扩展音频文件那么我们能做什么..?
  • @NitinGohel:嘿兄弟,我想他必须比较所有这些扩展程序!!!
  • 是的,但我只是想知道你能为我解释一下,这是为了我的理解请兄弟..
  • @NitinGohel:检查该链接,我已在我的答案中添加。
【解决方案2】:

查看NSURL 类。例如,您可以通过说isFileUrl 来查看 url 是否是文件 url。

此外,您可以通过以下方式获取 url 的最后一个组成部分(通常是文件名):

NSString *filename = [[url path] lastPathComponent];

这些可以帮助您做您需要的事情,但更重要的是查看NSURL 文档。

【讨论】:

  • +1 表示不依赖于fileExistsAtPath()(被沙盒阻止)的字符串/路径答案。 lastPathComponent 的预期值会改善答案...是否为空字符串 == 文件夹?
【解决方案3】:

对于任何 Swift 爱好者,来这里尝试检查文件是否是目录:

///
/// Check if NSURL is a directory
///
internal func fileIsDir(fileURL: NSURL) -> Bool {
    var isDir: ObjCBool = false;
    fileManager.fileExistsAtPath(fileURL.path!, isDirectory: &isDir)
    return Bool(isDir);
}

///
/// Check if a path is a directory
///
internal func fileIsDir(path: String) -> Bool {
    var isDir: ObjCBool = false;
    fileManager.fileExistsAtPath(path, isDirectory: &isDir)
    return Bool(isDir);
}

(请注意,我尝试过 return isDir as Bool 但没有成功。但上面的 Bool 启动似乎有效。)

【讨论】:

  • 不确定这是否是 swift 3 中的新 api。我做了return isDir.boolValue
【解决方案4】:

以图片文件类型为例

-(BOOL)isImageSource:(NSURL*)URL
{
    CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)URL, NULL);
    NSString *UTI = (__bridge NSString*)CGImageSourceGetType(source);
    CFRelease(source);

    CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers();
    NSArray *array = (__bridge NSArray*)mySourceTypes;
    CFRelease(mySourceTypes);

    return [array containsObject:UTI];
}

【讨论】:

    【解决方案5】:

    更新了 Evdzhan 对 Swift 4.0 的回答:

    //
    // Check if NSURL is a directory
    //
    func fileIsDir(fileURL: NSURL) -> Bool {
        var isDir: ObjCBool = false;
        FileManager.default.fileExists(atPath: fileURL.path!, isDirectory: &isDir)
        return isDir.boolValue
    }
    
    //
    // Check if a path is a directory
    //
    func fileIsDir(path: String) -> Bool {
        var isDir: ObjCBool = false;
        FileManager.default.fileExists(atPath: path, isDirectory: &isDir)
        return isDir.boolValue
    }
    

    【讨论】:

      【解决方案6】:

      如果你真的想确定它是一张图片

      if let _ =  UIImage(contentsOfFile: url.path){// is image} 
      

      或 Mac 上的 NSImage

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 2015-11-23
        • 2020-10-26
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多