В настоящее время я использую 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;
}
Документация Microsoft для FindNextFile
говорит: «Если данные должны быть отсортированы, приложение должно выполнить упорядочение после получения всех результатов». Так что, если вы хотите, чтобы каталог был отсортирован по дате изменения, вам придется прочитать все это и отсортировать его самостоятельно.