#objective-c #cocoa-touch #ios #nsfilemanager #filesize
#objective-c #cocoa-touch #iOS #nsfilemanager #размер файла
Вопрос:
В моем приложении для iPhone я использую следующий код для определения размера файла. Несмотря на то, что файл существует, я вижу ноль для размера. Кто-нибудь может мне помочь? Заранее спасибо.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *URL = [documentsDirectory stringByAppendingPathComponent:@"XML/Extras/Approval.xml"];
NSLog(@"URL:%@",URL);
NSError *attributesError = nil;
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:URL error:amp;attributesError];
int fileSize = [fileAttributes fileSize];
Комментарии:
1. Странно, с вашим кодом я могу правильно определить размер файла, в чем была проблема?
Ответ №1:
Попробуйте это;
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:URL error:amp;attributesError];
NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
long long fileSize = [fileSizeNumber longLongValue];
Обратите внимание, что размер файла не обязательно будет соответствовать целому числу (особенно со знаком), хотя вы, безусловно, могли бы уменьшить значение long для iOS, поскольку вы никогда не превысите его в реальности. В примере используется long long, поскольку в моем коде я должен быть совместим с системами с гораздо большим объемом доступного хранилища.
Комментарии:
1. Xcode 4.5 однострочный:
long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil][NSFileSize] longLongValue]
.2. Лучше быть,
unsigned long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil][NSFileSize] unsignedLongLongValue]
потому чтоNSFileSize
этоunsigned
long long
.3. Может быть записан еще короче:
unsigned long long size = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil].fileSize
4. Вы не можете отправить URL в качестве параметра Path. Вам необходимо отправить
[URL path]
Ответ №2:
Одна строка в Swift:
let fileSize = try! NSFileManager.defaultManager().attributesOfItemAtPath(fileURL.path!)[NSFileSize]!.longLongValue
Комментарии:
1.Обновлено для Swift 3:
let fileSize = try (FileManager.default.attributesOfItem(atPath: url.path)[.size] as! NSNumber).uint64Value
илиlet fileSize = try (FileManager.default.attributesOfItem(atPath: url.path) as NSDictionary).fileSize()
2. С быстрой обработкой ошибок….
let fileSize = (try? FileManager.default.attributesOfItem(atPath: url.path))?[.size] as? Int ?? 0
Ответ №3:
Если у вас есть URL
( NSURL
, а не a String
), вы можете получить размер файла без FileManager
:
let attributes = try? myURL.resourceValues(forKeys: Set([.fileSizeKey]))
let fileSize = attributes?.fileSize // Int?
Ответ №4:
Swift 4.x
do {
let fileSize = try (FileManager.default.attributesOfItem(atPath: filePath) as NSDictionary).fileSize()
print(fileSize)
} catch let error {
print(error)
}
Ответ №5:
Получите размер файла в МБ, попробуйте этот код для swift
func getSizeOfFile(withPath path:String) -> UInt64?
{
var totalSpace : UInt64?
var dict : [FileAttributeKey : Any]?
do {
dict = try FileManager.default.attributesOfItem(atPath: path)
} catch let error as NSError {
print(error.localizedDescription)
}
if dict != nil {
let fileSystemSizeInBytes = dict![FileAttributeKey.systemSize] as! NSNumber
totalSpace = fileSystemSizeInBytes.uint64Value
return (totalSpace!/1024)/1024
}
return nil
}