計算一個文件夾的大小,首先你要知道你想計算的是哪個文件夾的大小。
所以第一步,你要知道你的文件夾路徑。
文件路徑一般固定,所以可用宏來寫,例如:
#define SUNCustomCacheFile [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"Custom"]
那么我現在取得了文件夾的地址,如何計算這個文件的大小呢?(這里有一點需要說明,文件大小指的是什么呢?其實文件夾的大小指的是對于文件夾內的所有文件的總大小)
我們取得的文件夾路徑是一個字符串,想要取得這個路徑下文件夾的大小,我們考慮是不是把取得大小的方法寫到字符串的分類里更加便捷呢?答案是肯定的。
所以第二步,我們要創建NSString的分類。
在.h里聲明方法,例如:
- (unsigned long long)fileSize;
在.m里面實現。那么如何實現呢?
首先文件管理者是不可少的:
NSFileManager *mgr = [NSFileManager defaultManager];
其次判斷路徑是否存在(這里需要注意,我們傳的參數不是BOOL,而是BOOL*。為什么呢?從語法角度,參數需要的是一個指向BOOL類型的指針。另外只有將變量地址傳進去,方法內部才能根據變量地址的值找到存儲空間,把結果值傳進去。所以這個方法其實有兩個返回值。):
// 是否為文件夾
BOOL isDirectory = NO;
BOOL exists = [mgr fileExistsAtPath:self isDirectory:&isDirectory];
如果是文件夾,則要獲取全部的文件路徑(這里需要說一下,這里的路徑是去掉我們已經獲取的文件夾路徑的,后面的路徑):
NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:self];
然后遍歷所有的文件的子路徑:
for (NSString *subpath in enumerator)
獲取所有文件路徑的全路徑:
NSString *fullSubpath = [self stringByAppendingPathComponent:subpath];
累加所有的文件大小(這里其實又用到了.fileSize方法,但是這個方法并不是我們所寫的字符串的分類的方法,并且也不是字符串去調用的.fileSize方法。這里是):
size += [mgr attributesOfItemAtPath:fullSubpath error:nil].fileSize;
從這里我們就要寫,不是文件夾的路徑要怎么計算文件的大小了:
size = [mgr attributesOfItemAtPath:self error:nil].fileSize;
代碼示例:
- (unsigned long long)fileSize
{
// 總大小
unsigned long long size = 0;
// 文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
// 是否為文件夾
BOOL isDirectory = NO;
// 路徑是否存在
BOOL exists = [mgr fileExistsAtPath:self isDirectory:&isDirectory];
if (!exists) return size;
if (isDirectory) { // 文件夾
// 獲得文件夾的大小? == 獲得文件夾中所有文件的總大小
NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:self];
for (NSString *subpath in enumerator) {
// 全路徑
NSString *fullSubpath = [self stringByAppendingPathComponent:subpath];
// 累加文件大小
size += [mgr attributesOfItemAtPath:fullSubpath error:nil].fileSize;
}
} else { // 文件
size = [mgr attributesOfItemAtPath:self error:nil].fileSize;
}
return size;
}