Определение размера файла

#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
}