2013-06-17 11 views
33

Po moim programie pokazuje zawartość katalogu Dokumenty i jest wyświetlany w tableView. Ale katalog Dokumenty zawiera niektóre katalogi, trochę dźwięku, niektóre wideo i niektóre obrazy itp.iphone - jak sprawdzić, czy plik jest katalogiem, dźwiękiem, wideo lub obrazem?

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

Tak więc, chcę sprawdzić, czy plik jest katalogiem, a następnie obraz katalogu może zostać wyświetlony na obrazie komórki. To samo dotyczy audio, wideo i obrazu.

Wyszukiwanie w klasie NSFileManager classReference, ale dint uzyskać rozwiązanie.

Jak to zrobić?

Odpowiedz

47

Przykładowy kod:

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

Można również użyć Uniform Type Identifiers jak wyjaśnił Bavarioushere.

Przykładowy kod:

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

Ale za pomocą rozszerzenia, nie będzie mógł sprawdzić, czy jego katalogu .. – Subbu

+0

jeśli nie ma rozszerzenie oznacza, że ​​jest folderowi –

+0

@CodeJack: Sprawdź uaktualniony kod. – Bhavin

3

Spójrz na klasy NSURL. Możesz na przykład sprawdzić, czy adres URL pliku to URL pliku, podając isFileUrl.

Dodatkowo można uzyskać ostatni składnik URL (zazwyczaj nazwa pliku), wykonując:

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

Mogą one pomóc zrobić co trzeba, ale co ważniejsze spojrzeć na dokumentacji NSURL.

+0

+1 dla odpowiedzi typu string/path, która nie opiera się na' fileExistsAtPath() '(która jest blokowana przez Sandbox). Odpowiedź byłaby poprawiona przez oczekiwaną wartość 'lastPathComponent' ... czy pusty ciąg == folder? – pkamb

1

Tylko w przypadku pliku obrazu typu

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

przypadku jakichkolwiek Swift kochanków, przyjście na to pytanie stara się sprawdzić, jeśli plik jest katalogiem tutaj przejść:

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

(Należy pamiętać, że Próbowałem robić return isDir as Bool, ale to nie działało, ale powyższa inicjacja Bool wydaje się działać.)

+1

nie jestem pewien, czy to jest nowe API w szybkim 3. Zrobiłem 'return isDir.boolValue' – Zhao

1

Zaktualizowana odpowiedź Evdzhana dla 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 
}