2013-06-17 8 views
33

Il seguente programma mostra il contenuto della directory Documenti e viene visualizzato in una tabellaView. Ma la directory Documenti contiene alcune directory, alcuni audio, alcuni video e alcune immagini ecc.iphone - come verificare se il file è una directory, audio, video o immagine?

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

Quindi, voglio verificare se il file è directory, quindi l'immagine della directory può essere mostrata nel imageView della cella. Lo stesso per audio, video e immagine.

Ho cercato nella classe NSFileManagerRiferimento, ma non ho trovato una soluzione.

Come fare?

risposta

47

codice di esempio:

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

È inoltre possibile utilizzare Uniform Type Identifiers come spiegato da Bavarioushere.

codice di esempio:

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

Ma usando estensione, non saremmo in grado di verificare se la sua directory .. – Subbu

+0

se non v'è alcuna estensione significa che è la cartella –

+0

@CodeJack: Controllare il codice aggiornato. – Bhavin

3

un'occhiata alla classe NSURL. Puoi ad esempio vedere se l'url è un url di file dicendo isFileUrl.

Inoltre è possibile ottenere l'ultimo componente dell'URL (di solito il nome del file) facendo:

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

Questi possono aiutare a fare ciò che è necessario, ma ancora più importante guardare la documentazione di NSURL.

+0

+1 per una risposta stringa/percorso che non si basa su' fileExistsAtPath() '(che viene bloccato dalla Sandbox). La risposta sarebbe migliorata dal valore atteso per 'lastPathComponent' ... fa una stringa vuota == una cartella? – pkamb

1

Solo in caso di tipo di file immagine

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

Per tutti gli appassionati di Swift, arrivando a questa domanda cercando di controllare se un file è una directory qui si va:

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

(Si noti che Ho provato a fare return isDir as Bool ma non ha funzionato, ma l'avvio di Bool sembra funzionare.)

+1

non sicuro se si tratta di una nuova API in swift 3. Ho fatto 'return isDir.boolValue' – Zhao

1

Aggiornamento risposta di Evdzhan per 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 
} 
Problemi correlati