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

How can I list files in a directory by modification date?

本文关键字:文件 何按 修改 日期      更新时间:2023-10-16

目前我正在使用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函数来自不同的头文件,如下所示:

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] = '';
   /* 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;
}

FindNextFile的Microsoft文档说,"如果数据必须排序,应用程序必须在获得所有结果后进行排序。"因此,如果你想按照修改日期对目录进行排序,你必须自己全部读取并排序。