【Swift】FileのサイズをFileManagerで取得する方法!MBで表示
この記事からわかること
- SwiftのFileManagerの使い方
- ローカルへ保存したファイルのサイズ容量を取得するには?
- attributesOfItemメソッドとは?
- 取得できるファイル属性の種類
- MBへ変換する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
ローカルに保存しているファイルのサイズを取得する方法
FileManager
クラスやCore Data
などを使用してローカルに保存しているファイルのサイズ(容量)を取得するにはFileManager
クラスのattributesOfItem
メソッドを使用します。
let manager = FileManager.default
guard let docURL = manager.urls(for: .documentDirectory, in: .userDomainMask).first else {
fatalError("URL取得失敗")
}
// ファイル名を含めたフルパスを生成
let fullURL = docURL.appendingPathComponent("sample.txt")
do {
// 書き込み処理
try "Hello World!".write(to: fullURL,atomically: true,encoding: .utf8)
} catch{
print("書き込み失敗")
}
let attributes = try? manager.attributesOfItem(atPath: fullURL.path) as NSDictionary
print(attributes?.fileSize()) // Optional(14)
attributesOfItemメソッド
attributesOfItem
は引数に対象のファイルのパスを渡し、返り値は[FileAttributeKey : Any]
型になります。
func attributesOfItem(atPath path: String) throws -> [FileAttributeKey : Any]
NSDictionary
型にキャストするとfileSize
やfileModificationDate
メソッドが使用できるようになります。
let attributes = try? manager.attributesOfItem(atPath: fullURL.path) as NSDictionary
print(attributes?.fileSize())
NSDictionary
型にキャストしない場合はFileAttributeKey
型でキー値を指定することも可能です。
let attributes = try? manager.attributesOfItem(atPath: fullURL.path)
print(attributes?[.size])
取得できるファイル属性
容量だけでなく作成日や更新日など様々な情報を取得することが可能です。以下は実際に取得した中身です。
Optional({
NSFileCreationDate = "2023-11-29 09:58:30 +0000";
NSFileExtendedAttributes = {
"com.apple.TextEncoding" = {length = 15, bytes = 0x7574662d383b313334323137393834};
};
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = staff;
NSFileModificationDate = "2023-11-29 09:58:30 +0000";
NSFileOwnerAccountID = 501;
NSFilePosixPermissions = 420;
NSFileReferenceCount = 1;
NSFileSize = 14;
NSFileSystemFileNumber = 81390572;
NSFileSystemNumber = 16777234;
NSFileType = NSFileTypeRegular;
})
MBに変換する
ファイルサイズはバイト単位で取得できるのでそのまま使用するには分かりにくいです。MB単位に変換して数値で取得したい場合は1024 * 1024
で割って取得することが可能です。
let size = attributes?[.size]
if let bytes = size as? Int64 {
print(bytes) // 423360
let sizeInMB = Double(bytes) / (1024 * 1024)
print(sizeInMB) // 0.40374755859375
}
文字列でMBで取得するにはByteCountFormatter
を使用してuseMB
を指定することで0.4 MB
形式で取得することができます。useMB
を変更すればuseKB
などに変更することで任意の単位で簡単に取得することが可能です。
let size = attributes?[.size]
if let bytes = size as? Int64 {
let bcf = ByteCountFormatter()
bcf.allowedUnits = [.useMB]
bcf.countStyle = .file
print(bcf.string(fromByteCount: bytes)) // 0.4 MB
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。