如何按修改日期列出目录中的文件?

时间:2015-08-25 20:48:15

标签: c++ file-management readdir dirent.h

目前我正在使用readdir并且工作正常。现在时间到了我的文件夹杂乱无章,按字母顺序搜索列表(不保证,它的目录顺序)可能令人沮丧。那么,我如何修改下面的代码来按修改日期而不是当前的顺序进行排序?

static cell AMX_NATIVE_CALL n_dir_list( AMX* amx, cell* params)
{
    DIR *dir = (DIR*)params[1];

    struct dirent *ent;

    if ((ent = readdir (dir)) != NULL) 
    {
        cell *buf, *addr;

        amx_GetAddr(amx, params[3], &addr);

        switch (ent->d_type) 
        {
            case DT_REG:
                *addr = 2;
                break;
            case DT_DIR:
                *addr = 1;
                break;
            default:
                *addr = 0;
        }

        amx_GetAddr(amx, params[2], &buf);

        amx_SetString(buf, ent->d_name, 0, 0, params[4]);
        return true;
    }
    return false;
}

readdir函数来自dirent标头,如下所示:

static struct dirent *readdir(DIR *dirp)
{
   DWORD attr;
   if (dirp == NULL) {
      /* directory stream did not open */
      DIRENT_SET_ERRNO (EBADF);
      return NULL;
   }

   /* get next directory entry */
   if (dirp->cached != 0) {
      /* a valid directory entry already in memory */
      dirp->cached = 0;
   } else {
      /* get the next directory entry from stream */
      if (dirp->search_handle == INVALID_HANDLE_VALUE) {
         return NULL;
      }
      if (FindNextFileA (dirp->search_handle, &dirp->find_data) == FALSE) {
         /* the very last entry has been processed or an error occured */
         FindClose (dirp->search_handle);
         dirp->search_handle = INVALID_HANDLE_VALUE;
         return NULL;
      }
   }

   /* copy as a multibyte character string */
   DIRENT_STRNCPY ( dirp->curentry.d_name,
             dirp->find_data.cFileName,
             sizeof(dirp->curentry.d_name) );
   dirp->curentry.d_name[MAX_PATH] = '\0';

   /* compute the length of name */
   dirp->curentry.d_namlen = strlen (dirp->curentry.d_name);

   /* determine file type */
   attr = dirp->find_data.dwFileAttributes;
   if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
      dirp->curentry.d_type = DT_CHR;
   } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
      dirp->curentry.d_type = DT_DIR;
   } else {
      dirp->curentry.d_type = DT_REG;
   }
   return &dirp->curentry;
}

1 个答案:

答案 0 :(得分:1)

FindNextFile的Microsoft文档说:“如果数据必须排序,应用程序必须在获得所有结果后进行排序。”因此,如果您希望按修改日期排序目录,则必须全部阅读并自行排序。