1

我正在使用 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 员工 37187 Nov 25 11:25 第 1 部分

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 第 2 部分

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 第 3 部分

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 第 4 部分

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

-rw-r--r-- 1 David 员工 37187 Nov 25 11:25 第 6 部分

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

我正在使用 OS X 10.8 和 Xcode 4.5。

任何帮助将不胜感激。

4

2 回答 2

1

我发现了实际问题!

该文件未在以下之前关闭:

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

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

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];

谢谢大家。

于 2012-11-25T11:17:46.373 回答
0

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

unsigned long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:someFilePath error:nil] fileSize];
于 2012-11-25T10:33:55.260 回答