如何在Linux上的SDCARD中写入超过2000,000个文件。
我正在开发一个关于Fedora 9的程序。这个程序写完了 向SDCARD提供2000,000个文件。 这是程序代码。
int vnCount = 0;
int vnDirCount = 0;
int vnSubDirCount = 0;
int vnTotalCounts = 3600;
int vnTotalSubDirs = 8;
int vnTotalDirs = 1;
int vnWriteNum;
char vstrTmp[256];
memset(&vstrTmp[0], 0x00, sizeof(vstrTmp));
FILE *pfd;
while (vnDirCount < vnTotalDirs) {
memset(&vDstDirName[0], 0x00, sizeof(vDstDirName));
sprintf( &vDstDirName[0], "/media/SD/log/%08d", vnDirCount);
printf("<<< output dir: %s\n", &vDstDirName[0]);
if( mkdir( vDstDirName, 0x644 ) < 0 ) {
printf(">>> output dir: error 0 : %s\n", vDstDirName);
return -1;
}
usleep(1000*10);
vnSubDirCount = 0;
while(vnSubDirCount < vnTotalSubDirs) {
memset(&vSubDirName[0], 0x00, sizeof(vSubDirName));
sprintf(&vSubDirName[0], "%s/%02d", &vDstDirName[0], vnSubDirCount);
printf("??? output dir: %s\n", &vSubDirName[0]);
if( mkdir( vSubDirName, 0x777 ) < 0 ) {
printf("/// output dir: error : %s\n", vSubDirName);
return -1;
}
vnCount = 0;
while(vnCount < vnTotalCounts) {
memset(&vstrTmp[0], 0x00, sizeof(vstrTmp));
sprintf(&vstrTmp[0], "%s/%08d%06d.dat", &vSubDirName[0], vnCount);
printf("*** output file: %s\n", &vstrTmp[0]);
if ((pfd = fopen(&vstrTmp[0], "w")) == NULL)
{
printf(" @@@ Cannot open output file \n");
return 1;
}
memset(&buf[0], 0xaa, sizeof(buf));
printf("output file:1 \n");
vnWriteNum = fwrite(&buf[0], sizeof(buf), 1, pfd);
//ret = write(pfd, &buf[0], sizeof(buf));
printf("output file:2 \n");
if (vnWriteNum != 1) {
fclose(pfd);
printf(" $$$ Cannot write output file \n");
return 1;
}
if (fflush(pfd) != 0) {
printf(" ^^^ Cannot flush output file \n");
}
if (fsync(fileno(pfd)) != 0) {
printf(" ^^^ Cannot flush output file \n");
}
printf("output file:3 \n");
if (fclose(pfd) != 0) {
printf(" ### Cannot close output file \n");
}
usleep(1000*1);
vnCount = vnCount +1;
}
vnSubDirCount = vnSubDirCount + 1;
}
vnDirCount = vnDirCount + 1;
}
程序写入成功,直到2000000个文件。 但是在Linux konqueror上我无法在SDCARD中看到超过23000个文件。 只能看到23000个文件。 在konsole是太相同了。 所以我通过“fsck.vfat”linux命令检查SDCARD。 这是命令结果。
fsck.vfat /dev/sdd1
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
Orphaned long file name part "00000000000746.dat"
1: Delete.
2: Leave it.
? 1
Reclaimed 7658 unused clusters (31367168 bytes).
Free cluster summary wrong (479444 vs. really 487102)
1) Correct
2) Don't correct
如何在SDCARD上写入超过23000个文件。
每个文件的大小为3.5K。 SDCARD的容量为2G。此SDCARD格式为Windows上的FAT32(分配单元4K)。 Linux系统是Fedora 9。 谁能帮我。 感谢。
答案 0 :(得分:1)
您也可以使用其他文件系统。使用fdisk或gparted你应该能够操纵partisons。也许ext4或其他东西有更高的限制。
但总的来说,另一个答案是对的,你应该避免这样做并寻找更好的解决方案。使用那么多文件可能会变得缓慢而且不方便。你不能将所有文件存储在一个文件中吗?
答案 1 :(得分:1)
fat32文件系统有几个限制,一个是关于最大文件数:268,173,300(2 ^ 28ish)
正如basile所解释的那样,使用sqlite等数据库是可能的,但请记住,fat32上的文件不得超过4GB(或fat32 +上的〜260)
您可能还对拥有虚拟文件系统感兴趣:Simple Virtual Filesystem in C/C++
答案 2 :(得分:0)
不要这样做,FAT文件系统不适合大型目录和许多文件(所以我相信你做不到你想做的事)。而SDCARD flash硬件dislikes做了大量的写作!
你可以考虑其他方法,例如使用Sqlite或GDBM;那么至少你会写一个文件。
Sqlite可以在任何文件系统上使用,甚至可以像FAT一样原始。它只使用一个文件(另一个文件用于日记)。 Sqlite本质上是一个库,它为您提供存储在一个文件中的数据库的SQL功能。同样对于GDBM(它使用一个或两个文件)。当然,文件系统可能会限制(FAT32为4Gb)文件的最大大小。阅读一些sqlite tutorial,sqlite documentations,GDBM manual。
您还可以在SDCARD上使用一些不同的文件系统(例如ext3或ext4
或btrfs
,您将在Linux上阅读这些文件系统。