0

Apple documentationで説明されているように、ディレクトリのスナップショットを作成しようとしています。

scandir()関数を使いたい。これはドキュメントからのものです:

scandir(const char *dirname, struct dirent ***namelist, int (*select)(const struct dirent *),
     int (*compar)(const struct dirent **, const struct dirent **));

正しい使い方がわかりません。スナップショット機能を実装する方法は次のとおりです。

-(void)createFolderSnapshotWithPath:(NSString *)pathString
{

NSLog(@"snap");
const char *pathsToWatch=[pathString UTF8String];

struct dirent snapshot;


scandir(pathsToWatch, &snapshot, NULL, NULL); // I have a warning here because 
                                              // &snapshot used wrong here


NSLog(@"snap result: %llu | %s | %i",snapshot.d_ino, snapshot.d_name, snapshot.d_type);
// snapshot.d_type returns 0 which means unknown type (DT_UNKNOWN) 

}

ここにあるdirent struct

struct dirent {
    ino_t d_ino;            /* file number of entry */
    __uint16_t d_reclen;        /* length of this record */
    __uint8_t  d_type;      /* file type, see below */
    __uint8_t  d_namlen;        /* length of string in d_name */
    char d_name[__DARWIN_MAXNAMLEN + 1];    /* name must be no longer than this */
};

dirent structホットから適切な作成方法と、それを関数で適切に使用する方法がわかりませんscandir()

その関数に必要なのは、後で別のスナップショットと比較するときに使用できる配列だけです。

4

1 に答える 1

1

scandir()エントリの配列を割り当てます。

したがって、次のように 2 番目のパラメーターを宣言する必要があります。

struct dirent ** snapshot = NULL;

そして、呼び出しに成功しscandir()たら、次のようにそのメンバーにアクセスできます。

printf("%s", snapshot[0]->d_name);

例えば。

配列とそのエントリがもう使用されていない場合は、最初にすべてをループして呼び出しているエントリを解放します

free(snapshot[i]);

各エントリに対して、最後に次のことを行います。

free(snapshot);

これらをすべてまとめると、次のようになります。

#include <dirent.h>

int main(void)
{
  struct dirent ** namelist = NULL;
  int 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);
  }
}
于 2013-08-10T20:19:20.083 に答える