【问题标题】:How can I list files in a directory by modification date?如何按修改日期列出目录中的文件?
【发布时间】:2015-08-25 20:48:15
【问题描述】:

目前我正在使用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 header,如下:

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;
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多