3

stat()を使用して、コマンドラインで指定されたファイルまたはディレクトリのサイズを見つける必要があります。ファイル(相対パスと絶対パスの両方)に対しては正常に機能しますが、ディレクトリを指定すると、常にサイズが512または1024として返されます。

ディレクトリ内のファイルを印刷すると、次のようになります。

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

ただし、実際にはnewファイルとnew.cファイルのみが含まれています。このため、ディレクトリにさらにファイルを配置しても、サイズは512として返されます。これが私のコードフラグメントです:

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()");
    }
}

どこで私は間違えましたか???

これが私のリクエスト、返信の構造です:

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

UNIXOSのgccコンパイラで実行します。

4

3 に答える 3

9

stat()ディレクトリ上では、そのディレクトリ内のファイルサイズの合計は返されません。サイズフィールドは、代わりにディレクトリエントリが占めるスペースを表し、いくつかの要因によって異なります。特定のディレクトリの下にあるすべてのファイルが占めるスペースを知りたい場合は、ツリーを下に移動して、すべてのファイルが占めるスペースを合計する必要があります。これは、ツールのようなdu動作方法です。

于 2012-09-02T22:43:29.230 に答える
1

はい。opendir()+ readdir()/ stat()のループは、合計を取得するために合計できるファイル/ディレクトリのサイズを提供します。サブディレクトリがある場合は、それらとその中のファイルもループする必要があります。

duを使用するには、system()関数を使用できます。これは呼び出し側プログラムに結果コードを返すだけなので、結果をファイルに保存してからファイルを読み取ることができます。コードは次のようになります、

system("du -sb dirname > du_res_file");

次に、ファイルdu_res_fileを読み取って(正常に作成されていると想定)、回答を得ることができます。これにより、ディレクトリ+サブディレクトリ+ファイルのサイズが一度に得られます。

于 2012-09-03T01:29:23.687 に答える
0

申し訳ありませんが、初めて見逃しました。statはファイルのサイズのみを示し、ディレクトリは示しません。

これらの関数は、ファイルに関する情報を返します。ファイル自体に権限は必要ありませんが、stat()およびlstat()の場合、ファイルにつながるパス内のすべてのディレクトリに実行(検索)権限が必要です。

st_sizeフィールドは、ファイルのサイズ(通常のファイルまたはシンボリックリンクの場合)をバイト単位で示します。シンボリックリンクのサイズは、終了するヌルバイトを除いた、そこに含まれるパス名の長さです。

fstat/statのmanページを見てください

于 2012-09-02T22:38:59.433 に答える