【问题标题】:File size in Snow LeopardSnow Leopard 中的文件大小
【发布时间】:2010-01-31 17:15:44
【问题描述】:

我正在尝试弄清楚如何根据文件或目录的大小将文件(或目录)的字节大小分别转换为千字节、兆字节、千兆字节等,以便与 Finder 在面板中显示的内容相匹配当您点击“获取信息”时。

我得到的字节大小与 Finder 中报告的字节大小完全匹配,但我不知道如何使文件大小(由 Finder 以 KB、MB、GB 等显示)匹配。

我知道在 10.6 中我们使用基数 10,因此千字节是 1000 字节而不是 1024,但是将字节数除以 1000(或 1000^2、1000^3 等)与 Finder 报告的不匹配。

例如,在 Finder 中:一个 330 字节的文本文件显示为 4KB 文件(所以我最初的猜测是将所有文件大小四舍五入为 4KB 数字),但 389,022 字节的目录显示为418KB(远远超过四舍五入到 4KB,所以我的猜测是错误的)。此外,一个 1,315,291,136 字节的文件显示为 1.33GB。

那么,有没有人可以在这里提供一些启示?这些数字是如何计算的?我环顾四周,找不到答案。

提前感谢您的帮助!

附:自从我开始编程以来,我一直是 100% 面向 Cocoa 的,而且我之前从未使用过 Carbon 框架(我知道它非常强大,只是不知道如何使用它)。我提到这一点,以防万一有人想给我一个 Carbon 解决方案,假设我知道如何使用它。我没有。

【问题讨论】:

    标签: objective-c cocoa macos programming-languages


    【解决方案1】:

    在 HFS+ 中,每个 文件 将占用 4,096 字节的倍数(“块大小”)。

    如果您的 目录 包含一千个 1 字节的文件,则该目录占用的总大小将是

    (1000 * 4,096) = 4,096,000 = 4.1 MB,
    

    虽然目录使用的字节数还在

    1 * 1000 = 1,000 bytes.
    

    【讨论】:

      【解决方案2】:

      您可能没有测量资源分叉。您需要使用the Core Services File Manager 来迭代目录和测量文件的大小。与 NSFileManager 不同,文件管理器会告诉你资源分叉的大小。

      【讨论】:

        【解决方案3】:

        如果你愿意,可以使用我的NSValueTransformer 子类:

        @interface FileSizeTransformer : NSValueTransformer {
        
        }
        
        + (Class)transformedValueClass;
        + (BOOL)allowsReverseTransformation;
        - (id)transformedValue:(id)value;
        
        @end
        
        @implementation FileSizeTransformer
        + (Class)transformedValueClass;
        {
            return [NSString class];
        }
        
        + (BOOL)allowsReverseTransformation;
        {
            return NO;
        }
        - (id)transformedValue:(id)value;
        {
            if (![value isKindOfClass:[NSNumber class]])
                return nil;
        
            double convertedValue = [value doubleValue];
            int multiplyFactor = 0;
        
            NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil];
        
            while (convertedValue > 1024) {
                convertedValue /= 1024;
                multiplyFactor++;
            }
        
            return [NSString stringWithFormat:@"%4.2f %@",convertedValue, [tokens objectAtIndex:multiplyFactor],value];
        }
        
        @end
        

        【讨论】:

        • 虽然在大多数情况下不太可能,但您可能希望在最终返回语句之前添加if (multiplyFactor > ([tokens count] -1)) {return @"Huge!";}。否则,如果文件非常大(或者您要转换的数字是错误的),则会引发“索引超出范围”异常。
        【解决方案4】:

        该文件为 4 KB,因为这是 HFS+ 格式化驱动器的默认块大小。任何文件都不能小于 4 KB。我怀疑这就是为什么您的目录远不止四舍五入到 4 KB 的原因,因为该目录中的每个较小的文件都已经“四舍五入”到 4 KB 块,加在一起,差异可能确实很大。

        至于显示为 1.33GB 的 1,315,291,136 字节——它真的是一个整体文件吗? finder 中的许多文件,例如应用程序,实际上是在 finder 中抽象的许多较小文件的目录。如果您在文件上打开上下文菜单(右键单击),您是否会看到“显示包内容”选项?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-24
          • 1970-01-01
          • 2010-12-05
          • 2010-11-23
          • 1970-01-01
          • 2010-11-24
          • 1970-01-01
          相关资源
          最近更新 更多