如何在Linux上的SDCARD中写入超过2000,000个文件

时间:2014-11-15 16:33:32

标签: linux file fat32

如何在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。 谁能帮我。 感谢。

3 个答案:

答案 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做了大量的写作!

你可以考虑其他方法,例如使用SqliteGDBM;那么至少你会写一个文件。

Sqlite可以在任何文件系统上使用,甚至可以像FAT一样原始。它只使用一个文件(另一个文件用于日记)。 Sqlite本质上是一个,它为您提供存储在一个文件中的数据库的SQL功能。同样对于GDBM(它使用一个或两个文件)。当然,文件系统可能会限制(FAT32为4Gb)文件的最大大小。阅读一些sqlite tutorialsqlite documentationsGDBM manual

您还可以在SDCARD上使用一些不同的文件系统(例如ext3ext4btrfs,您将在Linux上阅读这些文件系统。

另见this&amp; that回答。