Как я могу перечислить файлы в каталоге по дате изменения?

В настоящее время я использую 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

Решение

Документация Microsoft для FindNextFile говорит: «Если данные должны быть отсортированы, приложение должно выполнить упорядочение после получения всех результатов». Так что, если вы хотите, чтобы каталог был отсортирован по дате изменения, вам придется прочитать все это и отсортировать его самостоятельно.

1

Другие решения


По вопросам рекламы [email protected]