ÆÄÀÏ : µð·ºÅ丮 ÀÛ¾÷Çϱâ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

  1. stat() ´ë½Å¿¡ lstat()¸¦ »ç¿ëÇϵµ·Ï ¿¹Á¦ º¯°æ, stat()¸¦ »ç¿ëÇÒ°æ¿ì ½Éº¼¸¯ ¸µÅ©¸¦ ¼³¸íÇÒ ¼ö ¾ø¾îÁø´Ù. - yundream 2004/01/26

µð·ºÅ丮 ¸®½ºÆ® °Ë»ö

1절. µð·ºÅ丮 Á¤º¸ °Ë»ö

1.1절. ¼Ò°³

¾Æ¸¶µµ ÀÌ »çÀÌÆ®¿¡ ÀÖ´Â ¹®¼­¸¦ ÀÐ¾î º¸¾Ò´Ù¸é, ÆÄÀϰú µð·ºÅ丮¿¡ °ü·ÃµÈ ¸î°³ÀÇ ±â»ç¸¦ ÀÐÀº ÀûÀÌ ÀÖÀ»°ÍÀÌ´Ù. À̹ø¿¡´Â file Á¤º¸(stat) ¿Í Á¾·ù ¾Ë¾Æ³»±â ÀÇ ³»¿ëÀ» ¾à°£ ÀÀ¿ëÇØ¼­ ÇÏÀ§ µð·ºÅ丮ÀÇ ÆÄÀÏÀ» Æ®¸® ±¸Á¶·Î º¸¿©ÁÖ°í, ¸ðµç ÆÄÀÏÀÇ Å©±âÀÇ ÃÑÇÕÀ» ³ªÅ¸³»ÁÖ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰٴÙ.


1.2절. ÄÚµå¹× ¼³¸í

´ÙÀ½Àº ¿¹Á¦ ÄÚµåÀÌ´Ù. Äڵ忡 ´ëÇÑ ¸ðµç ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. °£´ÜÇÑ ÇÁ·Î±×·¥À̹ǷΠÀÌÇØÇÏ´Â µ¥¿¡ ¹«¸®´Â ¾øÀ»°ÍÀÌ´Ù.

¿¹Á¦: scandisk.c

#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

// ÆÄÀÏÀÇ Å©±â¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö
long int total_size = 0;

// µð·ºÅ丮 µé¿©¾²±â¸¦ À§ÇÑ µð·ºÅ丮 depth ·¹º§ ÀúÀå¿ë
int  indent = 0;

// ÇÔ¼ö´Â ÀÎÀÚ·Î µð·ºÅ丮 À̸§À» ÀԷ¹޴´Ù. 
void dir_parser(char *wd)
{
    struct dirent **items;
    int nitems, i, j;
    struct stat fstat;
    char per;

    // ÀÎÀÚ·Î ¹ÞÀº µð·ºÅ丮·Î À̵¿ÇÑ´Ù. 
    if (chdir(wd) < 0)
    {
        perror("chdir ");
        exit(1);
    }

    // scandir ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÇöÀç µð·ºÅ丮ÀÇ 
    // ¸ðµç ÆÄÀϰú µð·ºÅ丮ÀÇ ³»¿ëÀ» °¡Á®¿Â´Ù. 
    nitems = scandir(".", &items, NULL, alphasort);

    // µð·ºÅ丮(ÆÄÀÏÆ÷ÇÔ) Ç׸ñÀÇ °¹¼ö¸¸Å­ ·çÇÁ¸¦ µ¹¸®¸ç
    // ¸¸¾à ÇØ´ç ÆÄÀÏÀÌ µð·ºÅ丮 Àϰæ¿ì 
    // dir_parser ÇÔ¼ö¸¦ Àç±Í È£ÃâÇÑ´Ù. 
    for (i = 0; i < nitems; i++)
    {
        // ÆÄÀÏ »óŸ¦ ÀúÀåÇϱâ À§ÇÑ ±¸Á¶Ã¼    
        struct stat fstat;

        // ÇöÀçµð·ºÅ丮, ÀÌÀüµð·ºÅ丮 ´Â ¹«½ÃÇÑ´Ù. 
        if ( (!strcmp(items[i]->d_name, ".")) || (!strcmp(items[i]->d_name, "..")) )
        {
            continue;
        }
        // ÆÄÀÏÀÇ »óŸ¦ ¾ò¾î¿Í¼­ fstat ·Î ÀúÀåÇÑ´Ù. 
        lstat(items[i]->d_name, &fstat);

        // µð·ºÅ丮ÀÇ depth ´Â "\t" À» ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. 
        // ÇØ´ç µª½ºÀÇ Å©±â¸¸Å­ "\t" ¸¦ ¹Ýº¹Çؼ­ Ãâ·ÂÇÑ´Ù. 
        for (j = 0; j < indent; j++)
        {
            printf("\t");
        }
        // ÆÄÀÏÀ̸§(µð·ºÅ丮)À̸§°ú Å©±â¸¦ Ãâ·ÂÇϰí 
        // ÃѰ踦 ³»±â À§Çؼ­ total_size ¿¡ ´õÇØÁØ´Ù. 
        printf("%s\t%d\n", items[i]->d_name, fstat.st_size);
        total_size += fstat.st_size;

        // ¸¸¾à ÆÄÀÏÀÌ µð·ºÅ丮 À̶ó¸é 
        // dir_parser À» Àç±Í È£ÃâÇÑ´Ù. 
        // ±×¸®°í µð·ºÅ丮ÀÇ depth ·¹º§À» 1 Áõ°¡ ÇÑ´Ù. 
        if (S_ISDIR(fstat.st_mode) && S_ISLNK(fstat.st_mode))
        {
            indent ++;
            dir_parser(items[i]->d_name);    
        }
    }
    // µð·ºÅ丮ÀÇ depth ·¹º§À» 1 °¨¼Ò½Ã۰í
    // ÇÏÀ§ µð·ºÅ丮·Î À̵¿ÇÑ´Ù. 
    indent --;
    chdir("..");
}

int main(int argc, char **argv)
{
    memset(direntry, 0x00, 255); 
    dir_parser(argv[1]);
    printf("size is %d byte\n", total_size);
}
			

À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÑÈÄ ½ÇÇà ½ÃŰ¸é ¾Æ·¡¿Í °°Àº °á°ú¹°À» º¸¿©ÁØ´Ù.

[root@loclhost test]# ./scandisk ./ 
syslog  4096
    .memchecker.c.swp       12288
    .memrecever.c.swp       12288
    .select.c.swp   12288
    memchecker      15456
    memchecker.c    1681
    memchecker.c.html       4794
    memrecever      15460
    memrecever.c    1480
    memrecever.c.html       3421
    select  14950
    select.c        1415
    select.c.html   3798
    syslog22        4096
        hello   0
...
size is 2354306 byte
			
ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ·Î ³Ñ±ä µð·ºÅ丮ÀÇ ¸ðµç ÇÏÀ§µð·ºÅ丮ÀÇ ÆÄÀϵéÀÇ À̸§°ú Å©±â¸¦ °Ë»çÇØ¼­ À̸¦ Ãâ·ÂÇØÁÖ°í, ¸¶Áö¸·¿¡´Â Àüü ÆÄÀÏÀÇ Å©±â¸¦ µÇµ¹·ÁÁØ´Ù. ¾î¶»°Ô º¸¸é du(1)¿Í ºñ½ÁÇÑ ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥ À̶ó°í º¼¼öµµ ÀÖÀ»°ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº º¸¸é ¾Ë°ÚÁö¸¸ ¿Ïº®ÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù. ±×·°Àú·° ÁÖ¾îÁø ¾÷¹«¸¦ ¼öÇàÇÏÁö¸¸, Ãâ·Â°á°úµµ ½â ¸¸Á·½º·´Áö ¸øÇϸç, Á» Ư¼öÇÑ ÆÄÀÏÀÌ µð·ºÅ丮 ³×¿¡ Á¸ÀçÇÒ°æ¿ì (/dev °°Àº) ÀÛµ¿À» Á¦´ë·Î ¸øÇÒ¼ö°¡ ÀÖ´Ù. Ãâ·Â°á°ú¸¦ º¸±âÁÁ°Ô ¸¸µé°í, ¿©·¯°¡Áö ¿¹¿Ü󸮸¦ ÇϴµîÀº °¢ÀÚÀÇ ¸òÀ¸·Î ³²±â°í ÀÌ ±ÛÀº ¿©±â¼­ ³¡³»µµ·Ï ÇϰڴÙ.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.