windows/msvc: Implement file/directory type query.
Add some more POSIX compatibility by adding a d_type field to the dirent structure and defining corresponding macros so listdir_next in the unix' port modos.c can use it, end result being uos.ilistdir now reports the file type.
This commit is contained in:
parent
397ee7c00e
commit
02ca8d4674
@ -25,6 +25,7 @@
|
||||
*/
|
||||
|
||||
#include "dirent.h"
|
||||
#include "extmod/vfs.h"
|
||||
#include <errno.h>
|
||||
#include <Windows.h>
|
||||
|
||||
@ -96,8 +97,22 @@ struct dirent *readdir(DIR *dir) {
|
||||
// first pass d_name is NULL so use result from FindFirstFile in opendir, else use FindNextFile
|
||||
if (!dir->result.d_name || FindNextFile(dir->findHandle, &dir->findData)) {
|
||||
dir->result.d_name = dir->findData.cFileName;
|
||||
dir->result.d_type = dir->findData.dwFileAttributes;
|
||||
return &dir->result;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int dttoif(int d_type) {
|
||||
if (d_type == INVALID_FILE_ATTRIBUTES) {
|
||||
return 0;
|
||||
}
|
||||
// Could be a couple of things (symlink, junction, ...) and non-trivial to
|
||||
// figure out so just report it as unknown. Should we ever want this then
|
||||
// the proper code can be found in msvc's std::filesystem implementation.
|
||||
if (d_type & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||
return 0;
|
||||
}
|
||||
return (d_type & FILE_ATTRIBUTE_DIRECTORY) ? MP_S_IFDIR : MP_S_IFREG;
|
||||
}
|
||||
|
@ -31,18 +31,24 @@
|
||||
// for ino_t
|
||||
#include <sys/types.h>
|
||||
|
||||
#define _DIRENT_HAVE_D_TYPE (1)
|
||||
#define DTTOIF dttoif
|
||||
|
||||
// opaque DIR structure
|
||||
typedef struct DIR DIR;
|
||||
|
||||
// the dirent structure
|
||||
// d_ino is always 0 - if ever needed use GetFileInformationByHandle
|
||||
// d_type can be converted using DTTOIF, into 0 (unknown) or MP_S_IFDIR or MP_S_IFREG
|
||||
typedef struct dirent {
|
||||
ino_t d_ino;
|
||||
int d_type;
|
||||
char *d_name;
|
||||
} dirent;
|
||||
|
||||
DIR *opendir(const char *name);
|
||||
int closedir(DIR *dir);
|
||||
struct dirent *readdir(DIR *dir);
|
||||
int dttoif(int d_type);
|
||||
|
||||
#endif // MICROPY_INCLUDED_WINDOWS_MSVC_DIRENT_H
|
||||
|
Loading…
Reference in New Issue
Block a user