2009-08-17 4 views
1

ich von Dave DeLong diese Methode bin mit der Größe eines Ordners mit dem Carbon-Datei-Manager-API zu berechnen:Größe Diskrepanz zwischen Größe des Ordners aus dem Finder und aus Carbon-Dateimanager

http://github.com/davedelong/BuildCleaner/blob/b2712242b4eea1fff0e78a08b393a417e3019c8a/NSFileManager+FileSize.m

(Sein die erste Methode dort)

Das Problem, das ich habe, ist, dass einige Ordner (.app Bundles in meinem Fall) nicht die richtige Größe melden. Zum Beispiel ist DiskWarrior 8.2MB und die Methode meldet 6.6MB

Irgendwelche Ideen, warum das passiert?

DANK

Antwort

1

Der Finder wird durch die reale Größe in Bytes, und viele (die meisten) Anwendungen sind Bündel von Dateien, Dateigrößen gerundet auf das nächste Vielfache der Blockgröße (in der Regel 4 KB), gefolgt zu melden, damit die Die wahre Größe der Anwendung kann viel kleiner sein als die Größe, die als erster ("auf Platte") Wert angezeigt wird.

Sie können dies testen, indem er etwas zu tun (im Terminal) wie:

echo -n 'foo' > foo.txt

Wenn Sie Info im Finder auf diese Datei zu bekommen, wird es die Größe als „4 KB auf der Festplatte berichten (3 Bytes) ".

+0

Hmm Ich habe versucht, mit dem Shell-Befehl "du-sk ", um die Größe des Ordners zu erhalten, und es immer noch viel näher an der eigentlichen Sache als der Carbon-Datei-Manager. Und ich bin mir ziemlich sicher, dass das du-Programm die Blockgröße nicht wie Finder abrundet. – indragie

+0

du zeigt die Blockanzahl an (Festplattennutzung). -k veranlasst, dass der Wert in 1-KB-Blöcken anstatt der Blockgröße der Festplatte gemeldet wird. – Wevah

0

Wenn Sie wissen, wie man applescript in Ihrem Code verwendet, ist hier eine Methode, die Größe zurückzugeben, die Sie im Finder Get Info-Fenster sehen würden. Beachten Sie, dass der zurückgegebene Wert in Byte ist.

on getSizeInBytesFromPosixPath(posixPath) 
    try 
     set b to (POSIX file posixPath) as string 
     tell application "Finder" to return size of (b as alias) 
    on error 
     return 0 
    end try 
end getSizeInBytesFromPosixPath 
+0

Danke, ich habe diese Methode ausprobiert und es funktioniert - die Größe ist genau wie vom Finder gemeldet. Es ist jedoch sehr langsam im Vergleich zu anderen Möglichkeiten, und es stürzt unter Last ab. Ich muss eine große Anzahl von Dateien und Ordnern gleichzeitig verarbeiten. Gibt es noch andere Möglichkeiten, um die vom Finder angegebene Größe zu erhalten? – indragie

2

Ich habe den von mir verlinkten Quellcode verbessert. Hier ist die neuere Version:

http://github.com/davedelong/BetterInfo/blob/aa1cfe079dad6207a7ddac84b108a768c2cc7156/NSFileManager+BetterInfo.m (Sie müssen auch die entsprechenden .h-Datei und this support file)

nun statt der Rückkehr und NSUInteger, gibt es eine Struktur vom Typ „BIItemSyze“, die sechs Mitglieder hat: dataLogicalSize, dataPhysicalSize, resourceLogicalSize, ressourcePhysicalSize, logicalSize und physicalSize.