Search code examples
iosswift

Get file size in Swift


I tried several method to get file size, but always get zero.

let path = NSBundle.mainBundle().pathForResource("movie", ofType: "mov")
let attr = NSFileManager.defaultManager().attributesOfFileSystemForPath(path!, error: nil)
if let attr = attr {
    let size: AnyObject? = attr[NSFileSize]
    println("File size = \(size)")
}

I get in log: File size = nil


Solution

  • Use attributesOfItemAtPath instead of attributesOfFileSystemForPath + call .fileSize() on your attr.

    var filePath: NSString = "your path here"
    var fileSize : UInt64
    var attr:NSDictionary? = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: nil)
    if let _attr = attr {
        fileSize = _attr.fileSize();
    }
    

    In Swift 2.0, we use do try catch pattern, like this:

    let filePath = "your path here"
    var fileSize : UInt64 = 0
    
    do {
        let attr : NSDictionary? = try NSFileManager.defaultManager().attributesOfItemAtPath(filePath)
    
        if let _attr = attr {
            fileSize = _attr.fileSize();
        }
    } catch {
        print("Error: \(error)")
    }
    

    In Swift 3.x/4.0:

    let filePath = "your path here"
    var fileSize : UInt64
    
    do {
        //return [FileAttributeKey : Any]
        let attr = try FileManager.default.attributesOfItem(atPath: filePath)
        fileSize = attr[FileAttributeKey.size] as! UInt64
    
        //if you convert to NSDictionary, you can get file size old way as well.
        let dict = attr as NSDictionary
        fileSize = dict.fileSize()
    } catch {
        print("Error: \(error)")
    }