Wie erhalte ich die Dateigröße für einen Pfad?

68

Ich habe einen Pfad zur Datei in einem NSString. Gibt es eine Methode, um die Dateigröße zu ermitteln?

Hekevintran
quelle

Antworten:

135

Dieser eine Liner kann Menschen helfen:

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

Dies gibt die Dateigröße in Bytes zurück.

Oded Ben Dov
quelle
2
Ich mag diesen. Aber in welcher Messung ist das? Bytes, Kb usw.? Danke auch.
James
7
Bytes - die Messung ist Bytes
Oded Ben Dov
Was passiert, wenn Ihre Datei größer als INT_MAXBytes ist? Möglicherweise möchten Sie das Ergebnis in size_toder unsigned long long intumwandeln, um eine genaue Berichterstattung über die Größe großer Dateien (> 2 GB) zu ermöglichen.
Alex Reynolds
3
Der tatsächliche Rückgabewert der Methode ist unsigned long long, intist also nicht geeignet, hier zu sein.
Coverback
74

Beachten Sie, dass fileAttributesAtPath: traverseLink: ab Mac OS X 10.5 veraltet ist. Verwenden Sie attributesOfItemAtPath:error:stattdessen unter der gleichen URL die gleichen Erwähnungen.

Mit der Einschränkung, dass ich ein Objective-C-Neuling bin und Fehler ignoriere, die beim Aufrufen auftreten können attributesOfItemAtPath:error:, können Sie Folgendes tun:

NSString *yourPath = @"Whatever.txt";
NSFileManager *man = [NSFileManager defaultManager];
NSDictionary *attrs = [man attributesOfItemAtPath: yourPath error: NULL];
UInt32 result = [attrs fileSize];
Frank Shearar
quelle
2
Dieser Code verliert den zugewiesenen FileManager. Ich empfehle Ihnen, einfach den Singleton NSFileManager.defaultManager zu verwenden, um dies zu vermeiden.
Johannes Rudolph
16

Für den Fall, dass jemand eine Swift-Version benötigt:

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

CPU löst mit attributeOfItemAtPath aus: Fehler:
Sie sollten stat verwenden .

#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);
Parag Bafna
quelle
Sollten Sie hier nicht fileSystemRepresentation anstelle von UTF8String verwenden?
David Knight
Du hast recht. HFS + definiert eine Standard-Unicode-Zerlegung ("kanonische Zerlegung") für Dateinamen. -UTF8String kann nicht garantiert werden, dass die richtige Komposition zurückgegeben wird. -fileSystemRepresentation ist. 1
Parag Bafna
@ParagBafna Ich weiß, dass dies ein alter Thread ist, aber wissen Sie, wie ich die statStruktur schnell verwenden kann?
Jonathan H.
8

Wenn Sie nur Dateigröße mit Bytes möchten, verwenden Sie einfach,

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

NSByteCountFormatter- Zeichenfolgenkonvertierung der Dateigröße (aus Bytes) mit präzisen KB, MB, GB ... Die Rückgabe erfolgt wie120 MBoder120 KB

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

Nach der Antwort von Oded Ben Dov würde ich hier lieber ein Objekt verwenden:

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

Swift 2.2:

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

Es gibt Dateigröße in Byte ...

uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:_filePath error:nil] fileSize];
Akshay Phulare
quelle
0

Swift4:

        let attributes = try! FileManager.default.attributesOfItem(atPath: path)
        let fileSize = attributes[.size] as! NSNumber
Denis Kreshikhin
quelle
0

In Swift 3.x und höher können Sie Folgendes verwenden:

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)")
}
d0ping
quelle