3

私はかなり長い間この手順をチェックして戦ってきましたが、うまくいきませんでした。助けていただければ幸いです。

アイデアは、格納されているディレクトリを読み取り、読み取ったディレクトリc_Localpathをコピーしc_namesLocalて返すことです。

実装で何か間違ったことをしていますか? でプログラムが中断しstrcpyます。その理由はわかりません。

DIR* ptr_dir = opendir(c_Localpath);

char** c_namesLocal = calloc(1, 256);

    size_t numElements = 0;
    int returnCode =0;
    struct dirent ptr_PrevDirEntry;
    struct dirent* ptr_DirEntry = NULL;
    returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
            &ptr_DirEntry);

    while ((returnCode ==0) && (ptr_DirEntry != NULL)) {
        char* name = c_namesLocal[numElements];
        strcpy(name, ptr_DirEntry->d_name);
        ptr_PrevDirEntry = *ptr_DirEntry;
        returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
                &ptr_DirEntry);
        numElements++;
        c_namesLocal = realloc(c_namesLocal, 256 * numElements);
    }
4

3 に答える 3

6

2年ぶりの返信ですみません。しかし、私は答えを知りたい他の人を助けたかった. の実装にreaddir_r取り​​組んできたので、コードを修正して機能させました。コード全体が機能するとは言えませんが、指定されたディレクトリで次のファイルエントリを取得できることは明らかです。したがって、これらのエントリを他の変数に保存して、好きなことを行うことができます。

下記を参照してください。

DIR* ptr_dir = opendir(c_Localpath);
size_t numElements = 0;
int returnCode =0;
struct dirent *ptr_PrevDirEntry = NULL;
struct dirent *ptr_DirEntry = NULL;
int len_entry;
char *c_namesLocal = NULL;

len_entry = offsetof(struct dirent, d_name) + fpathconf(dirfd(ptr_dir), _PC_NAME_MAX) + 1;
ptr_PrevDirEntry = malloc(len_entry);

if(!ptr_PrevDirEntry)
        exit(0);

for(;;){
        readdir_r(ptr_dir, ptr_PrevDirEntry, &ptr_DirEntry);
        if(!ptr_DirEntry)
            break;
        else
        {
                 if((strcmp(ptr_DirEntry->d_name, ".") != 0) && (strcmp(ptr_DirEntry->d_name, "..") != 0)) // skip "." and ".." file listings
                 {
                    //Perform copying or do whatever you want with the file entry read from the dir "c_Localpath"
                    //Increase numElements to 1 and keep on increasing by 1 on every iteration
                    numElements++;
                    //realloc everytime you find next entry
                    c_namesLocal = realloc(c_namesLocal, 256 * numElements);
                    //copy the next file name in the c_namesLocal[0], c_namesLocal[1] and so on.
                    strcpy(c_namesLocal[numElements - 1], ptr_DirEntry->d_name);
                 }
        }
 }

 //free "ptr_PrevDirEntry" before returning and take care of "c_namesLocal" as well.

上記のコードは一目瞭然です。お役に立てば幸いです。乾杯 :)

于 2014-11-27T06:48:29.473 に答える
0

これは null ポインターの例外であり、c_namesLocal実際には calloc によってすべて null に設定された 256/sizeof(char*) char * ポインターのシーケンスを指しているため、c_namesLocal[numElements] == 0. エントリごとにメモリを割り当てる必要があります。

于 2012-07-17T22:02:40.837 に答える
0

このコードでは:

char* name = c_namesLocal[numElements];
strcpy(name, ptr_DirEntry->d_name);

nameNULL として開始します。ポインターのベクトルを初期化しましたが、単一のポインター自体はまだ NULL を指しています。次のメモリを割り当てる必要がありd_nameます。

// You no longer need '*name'
c_namesLocal[numElements] = strdup(ptr_DirEntry->d_name);

次に、チェックを追加するのが賢明です。

if (NULL == (c_namesLocal[numElements] = strdup(ptr_DirEntry->d_name)))
{
    // signal out of memory and return
}

ポインターのベクトルを再割り当てするときも同じチェックが行われます。

于 2012-09-30T10:08:03.927 に答える