c语言 实现
#include "sys/stat.h"
- (long long) fileSizeAtPath:(NSString*) filePath{
struct stat st;if(lstat([filePath cStringUsingEncoding:NSUTF8StringEncoding], &st) == 0){
return st.st_size;
}
return 0;
}
objective-c 语言实现
-(long long) fileSizeAtPath:(NSString*) filePath{
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:filePath]){
return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
}
return 0;
}
其中C语言的性能比OC要高得多。
获取目录大小
- (long long)folderSize:(const char *)folderPath {
long long folderSize = 0;
DIR* dir = opendir(folderPath);
if (dir == NULL) {
return 0;
}
struct dirent* child;
while ((child = readdir(dir)) != NULL) {
if (child->d_type == DT_DIR
&& (child->d_name[0] == '.' && child->d_name[1] == 0)) {
continue;
}
if (child->d_type == DT_DIR
&& (child->d_name[0] == '.' && child->d_name[1] == '.' && child->d_name[2] == 0)) {
continue;
}
int folderPathLength = strlen(folderPath);
char childPath[1024];
stpcpy(childPath, folderPath);
if (folderPath[folderPathLength - 1] != '/'){
childPath[folderPathLength] = '/';
folderPathLength++;
}
stpcpy(childPath + folderPathLength, child->d_name);
childPath[folderPathLength + child->d_namlen] = 0;
if (child->d_type == DT_DIR){
folderSize += [self folderSize:childPath];
struct stat st;
if (lstat(childPath, &st) == 0) {
folderSize += st.st_size;
}
} else if (child->d_type == DT_REG || child->d_type == DT_LNK){
struct stat st;
if (lstat(childPath, &st) == 0) {
folderSize += st.st_size;
}
}
}
return folderSize;
}