Linux의 SDCARD에 2000,000 이상의 파일을 쓰는 방법.Linux의 SDCARD에 2000,000 이상의 파일을 쓰는 방법
저는 Fedora 9에서 프로그램을 개발 중입니다.이 프로그램은 2000,000 개의 파일 수를 SDCARD에 씁니다. 다음은이 프로그램 코드입니다.
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에서 23,000 개 이상의 파일을 볼 수 없습니다. 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
SD 카드의 파일 개수는 23000 개가 넘습니다.
각 파일의 크기는 3.5K입니다. SDCARD의 용량은 2G입니다. 이 SDCARD는 Windows의 FAT32 (할당 단위 4K) 형식입니다. 리눅스 시스템은 Fedora 9입니다. 아무도 도와 줄 수 있습니까? 감사합니다. .
감사 실레. 나는이 문제가 리눅스 커널의 취약점이나 FAT인지 모른다. 나 한테 대답 해? – bugLucky
FAT의 약점입니다 (처음에는 1 메가 바이트 플로피 용으로 설계되었습니다). –
감사합니다. Sqlite를 FAT32에서 실행할 수 있습니까? 내 프로그램은 FAT32 파일 시스템 만 사용합니다. 내 프로그램은 임베디드 리눅스 프로그램이다. 이 프로그램은 임베디드 장치에서 실행됩니다. 이 장치는 FAT32 SDCARD 만 사용합니다. 그래서 FAT32를 사용해야합니다. 나는 Sqlite가 안드로이드 데이터베이스 엔진이라는 것을 알고있다. Sqlite는 Ext2/3/4 파일 시스템에서만 실행됩니다. 아마 내 생각이 틀렸다. 뭐라 구요. 너 나 가르쳐 줄 수있어? – bugLucky