如何获得给定路径的文件大小?


Answers:


135

这一衬板可以帮助人们:

unsigned long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:someFilePath error:nil] fileSize];

这将返回文件大小(以字节为单位)。


2
我喜欢这一个。但是,这是什么度量?字节,Kb等?也谢谢你。
詹姆斯

7
字节-测量单位为字节
奥德·本·多夫

如果您的文件大于INT_MAX字节大小会怎样?您可能希望将结果强制转换为size_tunsigned long long int,从而可以准确报告大型文件的大小(> 2 GB)。
亚历克斯·雷诺兹

3
该方法的实际返回值为unsigned long long,因此int不适合在这里使用。
掩护

74

请记住,从Mac OS X v10.5开始不赞成使用fileAttributesAtPath:traverseLink:。attributesOfItemAtPath:error:改为使用,在相同的URL中由thesamet提及。

需要说明的是,我是一个Objective-C新手,而我忽略了调用中可能发生的错误attributesOfItemAtPath:error:,您可以执行以下操作:

NSString *yourPath = @"Whatever.txt";
NSFileManager *man = [NSFileManager defaultManager];
NSDictionary *attrs = [man attributesOfItemAtPath: yourPath error: NULL];
UInt32 result = [attrs fileSize];

2
此代码泄漏分配的FileManager。我建议您只使用NSFileManager.defaultManager Singleton来避免这种情况。
约翰内斯·鲁道夫

16

如果有人需要Swift版本:

let attr: NSDictionary = try! NSFileManager.defaultManager().attributesOfItemAtPath(path)
print(attr.fileSize())

12

CPU使用attributeOfItemAtPath:error引发:
应使用stat

#import <sys/stat.h>

struct stat stat1;
if( stat([inFilePath fileSystemRepresentation], &stat1) ) {
      // something is wrong
}
long long size = stat1.st_size;
printf("Size: %lld\n", stat1.st_size);

您不应该在这里使用fileSystemRepresentation而不是UTF8String吗?
大卫·奈特

你是对的。HFS +为文件名定义了标准的Unicode分解(“规范分解”)。-UTF8String不保证返回正确的组成;-fileSystemRepresentation是。1
Parag Bafna 2013年

@ParagBafna我知道这是一个旧线程,但是您知道如何stat快速使用该结构吗?
乔纳森·H.

8

如果您只想使用字节大小的文件,

unsigned long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:yourAssetPath error:nil] fileSize];

NSByteCountFormatter使用精确的KB,MB,GB转换文件大小(从字节)的字符串(从字节)...其返回值类似于120 MB120 KB

NSError *error = nil;
NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:yourAssetPath error:&error];
if (attrs) {
    NSString *string = [NSByteCountFormatter stringFromByteCount:fileSize countStyle:NSByteCountFormatterCountStyleBinary];
    NSLog(@"%@", string);
}

6

按照Oded Ben Dov的回答,我宁愿在这里使用一个对象:

NSNumber * mySize = [NSNumber numberWithUnsignedLongLong:[[[NSFileManager defaultManager] attributesOfItemAtPath:someFilePath error:nil] fileSize]];

2

Swift 2.2:

do {
    let attr: NSDictionary = try NSFileManager.defaultManager().attributesOfItemAtPath(path)
    print(attr.fileSize())
} catch {
        print(error)
}



0

在Swift 3.x及更高版本中,您可以使用:

do {
    //return [FileAttributeKey : Any]
    let attr = try FileManager.default.attributesOfItem(atPath: filePath)
    fileSize = attr[FileAttributeKey.size] as! UInt64

    //or you can convert to NSDictionary, then get file size old way as well.
    let attrDict: NSDictionary = try FileManager.default.attributesOfItem(atPath: filePath) as NSDictionary
    fileSize = dict.fileSize()
} catch {
    print("Error: \(error)")
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.