Skip to content

Commit 17f2e3f

Browse files
committed
Fix a couple of bugs with Win32 recursive directory handling when empty and file flag detection
1 parent 8ff367a commit 17f2e3f

2 files changed

Lines changed: 11 additions & 9 deletions

File tree

include/XNative/fs/xnative_fs_windows.hpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ class Win32FileInfo {
9393
Win32FileAttribute::OFFLINE | Win32FileAttribute::READONLY | Win32FileAttribute::SPARSE_FILE |
9494
Win32FileAttribute::SYSTEM | Win32FileAttribute::TEMPORARY
9595
);
96-
return (fileAttributes & regular_file_attrs) != 0;
96+
return (fileAttributes & regular_file_attrs) != 0 &&
97+
(fileAttributes & from_enum(Win32FileAttribute::DIRECTORY)) == 0;
9798
}
9899
size_t filesize() const { return fileSize; }
99100
Instant last_access() const {
@@ -119,7 +120,7 @@ class Win32DirectoryIterate {
119120
friend class Win32DirectoryIterator;
120121
Path m_path;
121122
bool m_recurse;
122-
Win32DirectoryIterate() : m_path(), m_recurse(){};
123+
Win32DirectoryIterate() : m_path(), m_recurse() {};
123124
Win32DirectoryIterate(Win32DirectoryIterate&& other) noexcept :
124125
m_path(move(other.m_path)), m_recurse(other.m_recurse) {}
125126
Win32DirectoryIterate& operator=(Win32DirectoryIterate&& other) noexcept {
@@ -133,13 +134,7 @@ class Win32DirectoryIterate {
133134
Win32DirectoryIterator end() const;
134135
};
135136
class Win32DirectoryIterator {
136-
enum class State {
137-
Uninitialized,
138-
Directory,
139-
File,
140-
Recursing,
141-
Finished
142-
};
137+
enum class State { Uninitialized, Directory, File, Recursing, Finished };
143138
friend Win32DirectoryIterate;
144139
friend struct PrintInfo<Win32DirectoryIterator>;
145140
Win32DirIterHandle m_hdl;

source/XNative/fs/xnative_fs_windows.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,13 @@ void Win32DirectoryIterator::load_next_file() {
181181
m_inner_curr = UniquePtr{ m_recursive_iterate.begin() };
182182
m_inner_end = UniquePtr{ m_recursive_iterate.end() };
183183
m_state = State::Recursing;
184+
if (*m_inner_curr == *m_inner_end) {
185+
// directory is empty. Go next.
186+
m_inner_curr.reset();
187+
m_inner_end.reset();
188+
m_state = State::File;
189+
load_next_file();
190+
}
184191
} else {
185192
HARD_ASSERT(false, "Unreachable");
186193
}

0 commit comments

Comments
 (0)