今天想测试一个问题,需要比较多的文件。所以使用了如下代码来在一个目录中生成多个文件。
1 char cTstFilename[MAX_PATH]; 2 FILE *file = NULL; 3 4 for(i = 0;i < 1000;i++) 5 // for(i = 0;i < 1005;i++) 6 { 7 sprintf(cTstFilename,"\\Nand2\\Music\\Filename%04d.mp3",i); 8 file = fopen(cTstFilename,"w"); 9 if(NULL != file) 10 { 11 fwrite(cTstFilename,1,strlen(cTstFilename),file); 12 fclose(file); 13 } 14 else 15 { 16 RETAILMSG(1,(L"create file failed with error code; %d\r\n",GetLastError())); 17 } 18 }
初次,想生成 1000 个文件。使用中看到文件个数为 999 时, 并为太在意。
后来,想生成 1005 个文件时,发现生成的文件个数仍然为 999,这时才觉得有问题。
因为在发现此问题前,没有 else 分支中的语句:RETAILMSG(1,(L"create file failed with error code; %d\r\n",GetLastError()));
else 分支在语句是在发现创建的文件个数没有达到想要的数量时才增加的。增加后看到多行如下输出:
create file failed with error code; 112
通过“错误查找”工具,知道 112 的含义是:磁盘空间不足。
但是通过 WinCE 资源管理可以看到,此分区空间足够。可以在此分区其它目录中复制/创建文件,但就是不能在 Nand2 目录再创建文件。
难道 WinCE 下一个目录中只能创建 999 个文件?
因为第 1000 个文件创建失败. 报错: 112(磁盘空间不足). 确认磁盘空间足够!如果只做此一次测试,是可以确认 WinCE 的一个目录中,最多只能有 999 个文件。可以在此目录中创建子目录,在子目录中可以创建文件。但只做一次测试足够吗?
最后验证,在一个目录中可以重复执行以上代码(修改一下文件名)。也就是说一个目录中,能创建的文件不只 999 个,几千个都是可以的。
sprintf(cTstFilename,"\\Nand2\\Music\\0Filename%04d.mp3",i); // 0Filename0000.mp3
sprintf(cTstFilename,"\\Nand2\\Music\\2Filename%04d.mp3",i); // 2Filename0000.mp3
都可以。
但:
sprintf(cTstFilename,"\\Nand2\\Music\\Filename%05d.mp3",i); // Filename00000.mp3
不行,不能创建文件成功。这是为什么呢?没有搞明白。
此问题,如果将创建目录修改为:\Temp,则可以生成所有文件,不会出现创建失败的问题。所以初步判断是 Nand 的驱动有问题,不是 WinCE 系统有问题。
2014年6月12日更新:怀疑的 WinCE Nand 驱动有关,想验证以下其它的方案。同时,是否是由于创建文件太快,引起 Nand 操作制作。所以进行了如下两个测试:
(1)使用 WinCE6.0 的 PND 进行测试,还是一样的现象。PND 的方案是:MStar 2521;
(2) 在创建文件后分别延时 30 和 100 毫秒,也是一样的现象。