Search code examples
cstructmessagestatreply

stat() giving wrong directory size in c


I need to find the size of a file or a directory whatever given in the commandline using stat(). It works fine for the files (both relative and absolute paths) but when I give a directory, it always returns the size as 512 or 1024.

If I print the files in the directory it goes as follows :

 Name : .
 Name : ..
 Name : new
 Name : new.c

but only the new and new.c files are actually in there. For this, the size is returned as 512 even if I place more files in the directory. Here s my code fragment:

if (stat(request.data,&st)>=0){
        request.msgType = (short)0xfe21;
        printf("\n Size : %ld\n",st.st_size);
        sprintf(reply.data,"%ld",st.st_size);
        reply.dataLen = strlen(reply.data);
    }
    else{
        perror("\n Stat()");
    }
}

Where did I go wrong???

here is my request, reply structure:

 struct message{
        unsigned short msgType;
        unsigned int offset;
        unsigned int serverDelay;
        unsigned int dataLen;
        char data[100];
    };
struct message request,reply;

I run it in gcc compiler in unix os.


Solution

  • stat() on a directory doesn't return the sum of the file sizes in it. The size field represents how much space it taken by the directory entry instead, and it varies depending on a few factors. If you want to know how much space is taken by all files below a specific directory, then you have to recurse down the tree, adding up the space taken by all files. This is how tools like du work.