Swift에서 파일 크기 가져오기
파일 크기를 얻기 위해 몇 가지 방법을 시도했지만 항상 0이 나옵니다.
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)")
}
로그인합니다.File size = nil
사용하다attributesOfItemAtPath
대신에attributesOfFileSystemForPath
+ 특성에 .fileSize()를 호출합니다.
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();
}
스위프트 2.0에서는 다음과 같은 시도 캐치 패턴을 사용합니다.
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)")
}
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)")
}
Swift4 : 파일 속성에 쉽게 접근할 수 있는 URL 확장자
내선번호:
extension URL {
var attributes: [FileAttributeKey : Any]? {
do {
return try FileManager.default.attributesOfItem(atPath: path)
} catch let error as NSError {
print("FileAttribute error: \(error)")
}
return nil
}
var fileSize: UInt64 {
return attributes?[.size] as? UInt64 ?? UInt64(0)
}
var fileSizeString: String {
return ByteCountFormatter.string(fromByteCount: Int64(fileSize), countStyle: .file)
}
var creationDate: Date? {
return attributes?[.creationDate] as? Date
}
}
용도:
let fileUrl: URL
print("file size = \(fileUrl.fileSize), \(fileUrl.fileSizeString)")
Swift 3+에서는 파일 크기를 URL에서 직접 가져올 수 있습니다.(NS)FileManager
필요 없습니다. 그리고.ByteCountFormatter
파일 크기를 표시하는 현명한 방법입니다.
let url = Bundle.main.url(forResource:"movie", withExtension: "mov")!
do {
let resourceValues = try url.resourceValues(forKeys: [.fileSizeKey])
let fileSize = resourceValues.fileSize!
print("File size = " + ByteCountFormatter().string(fromByteCount: Int64(fileSize)))
} catch { print(error) }
실제로 당신은 파일 사이즈를 받을 수 있습니다.URL
스위프트 2에서도 그렇지만 구문이 좀 더 번거롭습니다.
SWIFT 3은 @Hoa의 답변과 UInt64가 String을 읽을 수 있도록 기능을 추가한 것입니다.
func sizeForLocalFilePath(filePath:String) -> UInt64 {
do {
let fileAttributes = try FileManager.default.attributesOfItem(atPath: filePath)
if let fileSize = fileAttributes[FileAttributeKey.size] {
return (fileSize as! NSNumber).uint64Value
} else {
print("Failed to get a size attribute from path: \(filePath)")
}
} catch {
print("Failed to get file attributes for local path: \(filePath) with error: \(error)")
}
return 0
}
func covertToFileString(with size: UInt64) -> String {
var convertedValue: Double = Double(size)
var multiplyFactor = 0
let tokens = ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
while convertedValue > 1024 {
convertedValue /= 1024
multiplyFactor += 1
}
return String(format: "%4.2f %@", convertedValue, tokens[multiplyFactor])
}
파일 크기를 가져올 수 있는 Swift의 URL 확장자(있는 경우).
public extension URL {
var fileSize: Int? {
let value = try? resourceValues(forKeys: [.fileSizeKey])
return value?.fileSize
}
}
옵션 Int를 반환하는 이유는 알 수 없는 파일 크기가 0인 것으로 간주할 수 없기 때문입니다.
여기 바이오데이브의 답변이 있습니다. 올바른 파일 관리자 호출입니다.
func sizeForLocalFilePath(filePath:String) -> UInt64 {
do {
let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(filePath)
if let fileSize = fileAttributes[NSFileSize] {
return (fileSize as! NSNumber).unsignedLongLongValue
} else {
print("Failed to get a size attribute from path: \(filePath)")
}
} catch {
print("Failed to get file attributes for local path: \(filePath) with error: \(error)")
}
return 0
}
Swift 4.2의 경우:
func sizeForLocalFilePath(filePath:String) -> UInt64 {
do {
let fileAttributes = try FileManager.default.attributesOfItem(atPath: filePath)
if let fileSize = fileAttributes[FileAttributeKey.size] {
return (fileSize as! NSNumber).uint64Value
} else {
print("Failed to get a size attribute from path: \(filePath)")
}
} catch {
print("Failed to get file attributes for local path: \(filePath) with error: \(error)")
}
return 0
}
Swift 4 솔루션:이 함수는 MB 크기를 반환합니다.
func sizePerMB(url: URL?) -> Double {
guard let filePath = url?.path else {
return 0.0
}
do {
let attribute = try FileManager.default.attributesOfItem(atPath: filePath)
if let size = attribute[FileAttributeKey.size] as? NSNumber {
return size.doubleValue / 1000000.0
}
} catch {
print("Error: \(error)")
}
return 0.0
}
다음은 Swift 4를 사용한 다른 두 가지 구현입니다. 하나는 세부사항으로 포맷되어 있고 다른 하나는 10진수로 포맷되어 있습니다.
가 있는.NumberFomatter
:
func fileSize(fromPath path: String) -> String? {
var size: Any?
do {
size = try FileManager.default.attributesOfItem(atPath: path)[FileAttributeKey.size]
} catch (let error) {
print("File size error: \(error)")
return nil
}
guard let fileSize = size as? UInt64 else {
return nil
}
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.formatterBehavior = .behavior10_4
return formatter.string(from: NSNumber(value: fileSize))
}
그리고 다른 하나는 크기 단위로 정의하는 것입니다.
func fileSize(fromPath path: String) -> String? {
guard let size = try? FileManager.default.attributesOfItem(atPath: path)[FileAttributeKey.size],
let fileSize = size as? UInt64 else {
return nil
}
// bytes
if fileSize < 1023 {
return String(format: "%lu bytes", CUnsignedLong(fileSize))
}
// KB
var floatSize = Float(fileSize / 1024)
if floatSize < 1023 {
return String(format: "%.1f KB", floatSize)
}
// MB
floatSize = floatSize / 1024
if floatSize < 1023 {
return String(format: "%.1f MB", floatSize)
}
// GB
floatSize = floatSize / 1024
return String(format: "%.1f GB", floatSize)
}
이거 먹어봐요.
let MyUrl = NSURL(fileURLWithPath: "*** Custom File Path ***")
let fileAttributes = try! NSFileManager.defaultManager().attributesOfItemAtPath(MyUrl.path!)
let fileSizeNumber = fileAttributes[NSFileSize] as! NSNumber
let fileSize = fileSizeNumber.longLongValue
var sizeMB = Double(fileSize / 1024)
sizeMB = Double(sizeMB / 1024)
print(String(format: "%.2f", sizeMB) + " MB")
Swift 3.0에서는 다음을 시도해 봅니다.
let fileSize = try! FileManager.default.attributesOfItem(atPath: "/bin/bash")[FileAttributeKey.size] as! Int
또는 더 나은 경우:
let fileSize = (try! FileManager.default.attributesOfItem(atPath: "/bin/bash")[FileAttributeKey.size] as! NSNumber).uint64Value
몇 가지 다른 대답에서 영감을 얻었습니다.
extension URL {
var filesize: Int? {
let set = Set.init([URLResourceKey.fileSizeKey])
var filesize: Int?
do {
let values = try self.resourceValues(forKeys: set)
if let theFileSize = values.fileSize {
filesize = theFileSize
}
}
catch {
print("Error: \(error)")
}
return filesize
}
var filesizeNicelyformatted: String? {
guard let fileSize = self.filesize else {
return nil
}
return ByteCountFormatter.init().string(fromByteCount: Int64(fileSize))
}
}
다음은 Xcode7을 통한 Swift 2.0 for iOS9의 happy method로 작성된 컴팩트 버전입니다.
func sizeForLocalFilePath(filePath:String) -> UInt64 {
do {
let fileAttributes = try NSFileManager().attributesOfFileSystemForPath(filePath)
if let fileSize = fileAttributes[NSFileSystemSize] as? UInt64 {
return fileSize
} else {
print("Failed to get a size attribute from path: \(filePath)")
}
} catch {
print("Failed to get file attributes for local path: \(filePath) with error: \(error)")
}
return 0
}
맛있게 드세요.
언급URL : https://stackoverflow.com/questions/28268145/get-file-size-in-swift
'programing' 카테고리의 다른 글
도커 파일에서 PATH 환경 변수를 업데이트하는 방법? (0) | 2023.09.07 |
---|---|
Swift에서 두 버전 문자열 비교 (0) | 2023.09.07 |
팬더의 데이터 정규화 (0) | 2023.09.07 |
jQuery - 입력 필드의 관련 레이블 요소를 선택합니다. (0) | 2023.09.07 |
Java Spring - 누락된 필수 요청 매개 변수를 처리하는 방법 (0) | 2023.09.07 |