目前我正在使用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;
}
答案 0 :(得分:1)
FindNextFile
的Microsoft文档说:“如果数据必须排序,应用程序必须在获得所有结果后进行排序。”因此,如果您希望按修改日期排序目录,则必须全部阅读并自行排序。