GNU/Linux >> Linux の 問題 >  >> Linux

cでscandir()を適切に使用するには?

これは古い質問ですが、私はそれに出くわし、man ページほど効果的に質問を解決できなかったので、今後の新しい回答として man ページからコード スニペットをコピーしています。

  #include <dirent.h>

   int
   main(void)
   {
       struct dirent **namelist;
       int n;

       n = scandir(".", &namelist, NULL, alphasort);
       if (n < 0)
           perror("scandir");
       else {
           while (n--) {
               printf("%s\n", namelist[n]->d_name);
               free(namelist[n]);
           }
           free(namelist);
       }
   }

関数 scandir() がメモリを割り当てます。

メモリを割り当てる必要はありません。あなたは する scandir() によって返されたメモリを解放する必要があります .

あなたのコード呼び出し:*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);

戻ったら、noOfFiles path にディレクトリ エントリの数が含まれます ディレクトリ、および fileListTemp 割り当てられた struct dirent への割り当てられたポインタの配列を指します それぞれが d_name を持つブロブ ファイル/ディレクトリのヌル終了名を指すメンバー。

たとえば、ディレクトリに「FirstFile.txt」、「AnotherFile.txt」、「ThirdFile.txt」というファイルが含まれている場合、scandir() から戻ったときに呼び出しが行われます。 、 noOfFiles 5 に設定されます 3 つのファイルに加えて、"." 用にさらに 2 つのファイルが含まれます。および「..」ディレクトリエントリ。 「alphasort」を通過しない場合、エントリは特定の順序にはなりません。 (実際には少し間違っています。ファイルが最初に作成された順序に応じて、ディレクトリ ファイル名エントリの順序になります。)

'alphasort' を渡したので、次の順序でエントリが表示されるはずです (null-byte-string-terminator を明示的に表示しています:

fileListTemp[0]->d_name == ".\0"
fileListTemp[1]->d_name == "..\0"
fileListTemp[2]->d_name == "AnotherFile.txt\0"
fileListTemp[3]->d_name == "FirstFile.txt\0"
fileListTemp[4]->d_name == "ThirdFile.txt\0"

したがって、fileListTemp は、5 つの struct dirent を保持する割り当てられたメモリのブロックを指します。 ポインター。 5 つの struct dirent のそれぞれ ポインタは struct dirent を指します d_name に null で終わるディレクトリ エントリ名を含む、割り当てられたメモリのブロック メンバー。 (d_name エントリもポインタであるため、これも単純化されていますが、割り当てられたブロックの末尾に追加で割り当てられたスペースを指し、エントリ名がそこに格納されます。)

6 です 割り当てられたメモリのブロック。

この割り当てられたメモリは、使い終わるまで使用できます。その後、配列内の各エントリで free() を呼び出し、続いて配列自体の free() を呼び出します。

配列自体だけでなく、すべてのエントリを解放する必要があります。それらはすべて独立して割り当てられたメモリのブロブです。

リストが完成したら、次のことを行う必要があります:

for (int i = 0; i < noOfFiles; i++)
  {
  free(fileListTemp[i];
  }

free(fileListTemp);

Linux
  1. LinuxでBusyBoxを使用する方法

  2. Bash履歴コマンドの使用方法

  3. Linuxでcronを使用する方法

  1. LinuxでFINDを使用する方法

  2. Nginxを使用してリダイレクトする方法

  3. LinuxでSuコマンドを使用する方法

  1. vimでpylintを使用する方法

  2. dos2unix の使い方

  3. 2 つの引数を持つエイリアスで $1 を適切に使用する方法