Subbu
Subbu

Reputation: 2101

iphone - how to check if the file is a directory , audio , video or image?

Following my program shows contents of Documents directory and is displayed in a tableView . But the Documents directory contains some directories , some audio , some video , and some images etc .

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

So , I want to check if file is directory then it directory image can be shown in the cell's imageView . Same for audio , video and image .

I searched in NSFileManager classReference , but dint get a solution .

How to do this ?

Upvotes: 37

Views: 25622

Answers (6)

J. V.
J. V.

Reputation: 376

if you really want to be sure it is an image

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

or NSImage on a Mac

Upvotes: 1

dougzilla
dougzilla

Reputation: 166

Updated Evdzhan's answer for 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
}

Upvotes: 3

Hugo the Lee
Hugo the Lee

Reputation: 101

Just in case of image file type

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

Upvotes: 3

Evdzhan Mustafa
Evdzhan Mustafa

Reputation: 3735

For any Swift lovers, coming to this question trying to check if a file is a directory here you go:

///
/// 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);
}

(Note that I tried doing return isDir as Bool but it didn't work. But the above Bool initiation seems to work.)

Upvotes: 3

Bhavin
Bhavin

Reputation: 27225

Sample Code :

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

You can also use Uniform Type Identifiers as explained by Bavarious here.

Sample Code :

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);

Upvotes: 56

William Falcon
William Falcon

Reputation: 9813

Look at the NSURL class. You can for example see if the url is a file url by saying isFileUrl.

Additionally you can get the last component of the url (usually the file name) by doing:

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

These can help you do what you need, but more importantly look at the NSURL documentation.

Upvotes: 3

Related Questions