Ordergröße unter OSX ermitteln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ordergröße unter OSX ermitteln

    Sehr geehrte Forum-User,

    ich möchte die Größe eines Ordners ermitteln. Ich benutze dafür folgenden CODE:

    Quellcode

    1. // Ermittlung der einzelnen Dateigröße - START
    2. -(float)FileSize:(NSString *)filePath
    3. {
    4. NSFileManager *fileManager=[NSFileManager defaultManager];
    5. NSDictionary *attributesDict=[fileManager attributesOfItemAtPath:filePath error:NULL];
    6. NSInteger fileSize=[attributesDict fileSize];
    7. NSLog(@"Größe: %ld",fileSize);
    8. return fileSize;
    9. }
    10. // Ermittlung der einzelnen Dateigröße - ENDE
    11. - (IBAction)ButtonPressed:(id)sender {
    12. float filesize = 0;
    13. NSLog(@"Button Pressed");
    14. NSString *folderPath = [@"~/Library/Caches/" stringByResolvingSymlinksInPath];
    15. NSLog(@"Hauptpfad: %@",folderPath);
    16. NSArray *folderContents = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil];
    17. int i;
    18. for (i = 0; i < [folderContents count]; i++) {
    19. NSLog(@"Datei %@",[folderContents objectAtIndex:i]);
    20. filesize = filesize + [self FileSize:[folderContents objectAtIndex:i]];
    21. }
    22. NSLog(@"Code: %f",filesize);
    23. }
    Alles anzeigen


    Ich bekomme immer den Wert 0 bei jeder Datei zurück. Es scheint an dem Pfad zu liegen. Hat jemand deine IDEE?

    Mit freundlichen Grüssen
    D. Stachowiak
  • Danke für die vielen Antworten. Ich habe zumindest erstmal ein Problem ausgemacht. Ich übergebe den vollen Pfad an den Code

    Quellcode

    1. ​NSArray *folderContents = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil];


    Und dieser schneidet mir den vollen Pfad ab. Ich sehe im Array nur die Pfad in dem Ordner.

    Mit freundlichen Grüssen
    D. Stachowiak
  • necromonger schrieb:

    Danke für die vielen Antworten. Ich habe zumindest erstmal ein Problem ausgemacht. Ich übergebe den vollen Pfad an den Code

    Quellcode

    1. ​NSArray *folderContents = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil];


    Und dieser schneidet mir den vollen Pfad ab. Ich sehe im Array nur die Pfad in dem Ordner.

    Mit freundlichen Grüssen
    D. Stachowiak


    da wird nix abgeschnitten, da wird genau das geliefert was auch die methode und die doku dazu sagen. und zwar den SUB-path.
    um den gesamten pfad zu haben musst du ihn zusammenfügen.
  • Danke für die Antworten. Irgendwie bin ich zu Blöd oder ich sehe den Fehler nicht! Den vollen Pfad habe ich jetzt abgebildet. Ich versuche eine Dateigröße von einer Datei zu ermitteln

    Quellcode

    1. -(void)DateiSize:(NSString *)filePath
    2. {
    3. NSError *error;
    4. NSNumber * mySize = [NSNumber numberWithUnsignedLongLong:[[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error] fileSize]];
    5. if (!error)
    6. {
    7. NSLog(@"myFile Size %@" , mySize);
    8. } else NSLog(@"myFile Size %@" , error);
    9. }
    Alles anzeigen


    Übergeben mit folgendem Befehl:
    [self DateiSize:@"~/Users/davidstachowiak/Dokumete/S01E01.m4v"];

    zum Beispiel. Ich bekomme immer wieder folgende Fehlermeldung:

    myFile Size Error Domain=NSCocoaErrorDomain Code=260 "The file “S01E01.m4v” couldn’t be opened because there is no such file." UserInfo=0x610000073500 {NSFilePath=~/Users/davidstachowiak/Dokumete/S01E01.m4v, NSUnderlyingError=0x61000004a4a0 "The operation couldn’t be completed. No such file or directory"}

    Irgendwie ist der Pfad falsch. Ich sehe den Fehler nicht. Bitte um Hilfe!
  • Hallo,

    die Frage ist halt schon was Du mit Größe meinst!?
    Für den Anwender sichtbare Größe? Mit Systemdateien? Mit unsichtbaren Dateien? Mit Extras? etc. …

    Hier mal ein Beispiel was ich Dir grade runtergeschrieben habe.
    Da ich gerade in einer Sandbox-App arbeite konnte ich nicht testen und mögliche Fehler darfst Du somit selbst suchen ;)

    Viele Grüße

    Quellcode

    1. -(long long)sizeOfDirectoryAtURL:(NSURL*)URL
    2. {
    3. // …
    4. if(URL == nil)
    5. {
    6. return -1;
    7. }
    8. // …
    9. NSNumber *number = nil;
    10. NSError *error = nil;
    11. // …
    12. [URL getResourceValue:&number
    13. forKey:NSURLIsDirectoryKey
    14. error:&error];
    15. if(error != nil)
    16. {
    17. return -1;
    18. }
    19. // …
    20. if([number boolValue] == NO)
    21. {
    22. return -1;
    23. }
    24. // …
    25. NSFileManager *fileManager = [NSFileManager defaultManager];
    26. if(fileManager == nil)
    27. {
    28. return -1;
    29. }
    30. // …
    31. BOOL(^errorHandler)(NSURL*, NSError*);
    32. errorHandler = ^(NSURL *url, NSError *error)
    33. {
    34. // …
    35. NSLog(@"%@\n%@\n\n", url, [error localizedDescription]);
    36. // …
    37. return YES;
    38. // …
    39. };
    40. // …
    41. NSDirectoryEnumerator *directoryEnumerator = [fileManager enumeratorAtURL:URL
    42. includingPropertiesForKeys:@[NSURLIsDirectoryKey, NSURLFileSizeKey]
    43. options:0
    44. errorHandler:errorHandler];
    45. if(directoryEnumerator == nil)
    46. {
    47. return -1;
    48. }
    49. // …
    50. unsigned long long x = 0;
    51. // …
    52. for(NSURL *nURL in directoryEnumerator)
    53. {
    54. // …
    55. NSLog(@"NXT URL\n%@\n\n", nURL);
    56. // …
    57. error = nil;
    58. // …
    59. [nURL getResourceValue:&number
    60. forKey:NSURLIsDirectoryKey
    61. error:&error];
    62. if(error != nil)
    63. {
    64. // …
    65. NSLog(@"ERR\n%@\n\n", nURL);
    66. // …
    67. continue;
    68. // …
    69. }
    70. // …
    71. unsigned long long y = 0;
    72. // …
    73. if([number boolValue] == YES)
    74. {
    75. // …
    76. y = [self sizeOfDirectoryAtURL:nURL];
    77. // …
    78. }
    79. else
    80. {
    81. // …
    82. [nURL getResourceValue:&number
    83. forKey:NSURLFileSizeKey
    84. error:&error];
    85. if(error != nil)
    86. {
    87. // …
    88. NSLog(@"ERR\n%@\n\n", nURL);
    89. // …
    90. continue;
    91. // …
    92. }
    93. // …
    94. y = [number unsignedLongLongValue];
    95. // …
    96. }
    97. // …
    98. if(y < 1)
    99. {
    100. continue;
    101. }
    102. // …
    103. x = x + y;
    104. // …
    105. }
    106. // …
    107. return x;
    108. // …
    109. }
    Alles anzeigen
  • Danke für Antwort und den schnell geschriebenen Code. Ich habe nur eine kurze Frage.

    Wenn ich folgende Code laufen lassen:

    Quellcode

    1. NSError *error = nil;
    2. NSString *path = [@"~/Library/Cookies/" stringByResolvingSymlinksInPath];
    3. NSFileManager *manager = [NSFileManager defaultManager];
    4. NSArray *directoryContent =
    5. [manager contentsOfDirectoryAtPath:path error:&error];
    6. for(id file in directoryContent) {
    7. NSLog(@"%@", file);
    8. }
    Alles anzeigen


    Wird mir in der Konsole alle Dateien angezeigt. Ich bekomme aber komische Ausgabe.

    Beispiel:

    Ausgabe Konsole
    /Users/davidstachowiak/Library/CookiesCookies.binarycookies

    Die Ordner heißen aber richtig: /Users/davidstachowiak/Library/Cookies/Cookies.binarycookies

    Es fehlt bei allen Ordner in diesem Verzeichnis nach dem Cookies ein /. Das gleiche Phänomen habe ich beim Ordner Caches.
    Kann mir jemand kurz erklären, warum das so ist?

    Mit freundlichen Grüssen
    D. Stachowiak