【问题标题】:cocoa NSFileManager wrong file sizecocoa NSFileManager 文件大小错误
【发布时间】:2012-11-13 00:55:07
【问题描述】:

我正在使用 NSFileManager 来获取我们应用程序中某些文件的大小。

每个文件都由一个单独的线程检查,所有文件的结果都是相同的错误值。在单独的线程中为每个文件运行以下代码:

NSFileManager *fileManager= [[NSFileManager alloc] init];
NSUInteger completedFileSize = [[[fileManager attributesOfItemAtPath:fileName error:&error] objectForKey:NSFileSize] unsignedLongValue];
NSLog(@"Part %lu: %@ => size:%lu actual size:%lu", myPart.SequenceNumber, fileName, completedFileSize, myPart.Size);

输出是:

第 1 部分:/Users/David/TEMP/245E0BF53ECA/part1 => 大小:36864 实际大小:37187

第 5 部分:/Users/David/TEMP/245E0BF53ECA/part5 => 大小:36864 实际大小:37187

第 2 部分:/Users/David/TEMP/245E0BF53ECA/part2 => 大小:36864 实际大小:37187

第 4 部分:/Users/David/TEMP/245E0BF53ECA/part4 => 大小:36864 实际大小:37187

第 3 部分:/Users/David/TEMP/245E0BF53ECA/part3 => 大小:36864 实际大小:37187

第 6 部分:/Users/David/TEMP/245E0BF53ECA/part6 => 大小:36864 实际大小:37187

第 7 部分:/Users/David/TEMP/245E0BF53ECA/part7 => 大小:36864 实际大小:37186​​

第 0 部分:/Users/David/TEMP/245E0BF53ECA/part0 => 大小:36864 实际大小:37189

终端上 ls -l 命令的输出与之前保存在 myPart.Size

中的正确文件大小相同

-rw-r--r-- 1 David 员工 37189 Nov 25 11:25 part0

-rw-r--r-- 1 David Staff 37187 Nov 25 11:25 part1

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 part2

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 part3

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 part4

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 part5

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 part6

-rw-r--r-- 1 David 员工 37186​​ Nov 25 11:25 part7

我使用的是 OS X 10.8 和 Xcode 4.5。

任何帮助将不胜感激。

【问题讨论】:

  • 你不说myPart.Size是怎么计算出来的。
  • 您确定 fileName 变量设置正确并且不需要 [NSString stringWithFormat:@"%@%lu", fileName, myPart.SequenceNumber] 之类的东西吗?
  • 是的,文件名是正确的,因为日志表明了这一事实。
  • This: NSLog(@"Part %lu: %@ => size:%lu 实际大小:%lu", myPart.SequenceNumber, fileName, completedFileSize, myPart.Size);无法产生您列出的输出。
  • 谢谢。我在复制输出时出错。我修复了它,但它真的没有多大帮助。

标签: objective-c macos cocoa nsfilemanager


【解决方案1】:

我找到了真正的问题!

文件在以下之前没有关闭:

[[[fileManager attributesOfItemAtPath:fileName error:&error] objectForKey:NSFileSize] unsignedLongValue];

所以我关闭了与 pathfileName 变量关联的文件处理程序,问题就解决了。

fclose(myFile); //this is the handler for fileName
//now the value returned from the below line is correct.
[[[fileManager attributesOfItemAtPath:fileName error:&error] objectForKey:NSFileSize] unsignedLongValue];

谢谢大家。

【讨论】:

    【解决方案2】:

    我认为你应该使用 defaultManager 和 fileSize 来计算文件大小。

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

    【讨论】:

    • [NSFileManager defaultManager] 不是线程安全的,应该使用 [[NSFileManager alloc] init] 代替。我也试过fileSize,结果是一样的。
    • @DavidJames 这不准确。来自docs:“共享的 NSFileManager 对象的方法可以安全地从多个线程中调用。但是,如果您使用委托来接收有关移动、复制、删除和链接操作状态的通知,您应该创建一个唯一的文件管理器对象的实例,将您的委托分配给该对象,并使用该文件管理器来启动您的操作。”
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2012-02-09
    • 2015-10-15
    • 1970-01-01
    • 2011-04-27
    • 2014-12-10
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多