web-dev-qa-db-fra.com

iphone - comment vérifier si le fichier est un répertoire, audio, vidéo ou image?

Suivre mon programme affiche le contenu du répertoire Documents et s'affiche dans une tableView. Mais le répertoire Documents contient des répertoires, de l'audio, de la vidéo et des 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]);

Donc, je veux vérifier si le fichier est un répertoire, puis l'image du répertoire peut être affichée dans l'imageView de la cellule. Idem pour l'audio, la vidéo et l'image.

J'ai cherché dans NSFileManager classReference, mais je ne peux pas trouver de solution.

Comment faire cela?

35
Subbu

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

Vous pouvez également utiliser Identificateurs de type uniforme comme expliqué par Bavarious ici .

Exemple de 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);
54
Bhavin

Regardez la classe NSURL. Vous pouvez par exemple voir si l'url est une URL de fichier en disant isFileUrl.

De plus, vous pouvez obtenir le dernier composant de l'URL (généralement le nom du fichier) en faisant:

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

Ceux-ci peuvent vous aider à faire ce dont vous avez besoin, mais plus important encore, consultez la documentation NSURL.

3
William Falcon

Juste en cas de type de fichier image

-(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];
}
2
Hugo the Lee

Mise à jour de la réponse d'Evdzhan pour 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
}
2
dougzilla

Pour tous les amoureux de Swift, en venant à cette question en essayant de vérifier si un fichier est un répertoire ici, vous allez:

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

(Notez que j'ai essayé de faire return isDir as Bool mais ça n'a pas marché. Mais l'initiation Bool ci-dessus semble fonctionner.)

2
Evdzhan Mustafa