-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Add file size to DirectoryEntry #24176
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 15 commits
60306a9
2a19b95
19c8a58
9cc86ca
331c5af
47323f2
78d3c79
2a6b3ab
6037bb9
99a7632
2ce171d
2eecbfc
4e840cd
5acaaf7
b582141
ae4ae1f
0257b05
de66291
f11bd48
6c3d3b4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -169,15 +169,19 @@ struct DirectoryEntry { | |
| // target. For example, if name_ is a symlink to a directory, its file type will be Directory. | ||
| FileType type_; | ||
|
|
||
| // The file size in bytes for regular files. Should not be relied on for directories, | ||
| // symlinks, or FileType::Other. | ||
| uint64_t size_bytes_; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any way we can make this less of a footgun? One thing that comes to mind is wrapping it in a call that ASSERTs that
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Asserting that Using |
||
|
|
||
| bool operator==(const DirectoryEntry& rhs) const { | ||
| return name_ == rhs.name_ && type_ == rhs.type_; | ||
| return name_ == rhs.name_ && type_ == rhs.type_ && size_bytes_ == rhs.size_bytes_; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sorry if I'm missing but did we test this new equivalence?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We did now. |
||
| } | ||
| }; | ||
|
|
||
| class DirectoryIteratorImpl; | ||
| class DirectoryIterator { | ||
| public: | ||
| DirectoryIterator() : entry_({"", FileType::Other}) {} | ||
| DirectoryIterator() : entry_({"", FileType::Other, 0}) {} | ||
| virtual ~DirectoryIterator() = default; | ||
|
|
||
| const DirectoryEntry& operator*() const { return entry_; } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,7 +16,7 @@ DirectoryIteratorImpl::DirectoryIteratorImpl(const std::string& directory_path) | |
| fmt::format("unable to open directory {}: {}", directory_path, ::GetLastError())); | ||
| } | ||
|
|
||
| entry_ = {std::string(find_data.cFileName), fileType(find_data)}; | ||
| entry_ = makeEntry(find_data); | ||
| } | ||
|
|
||
| DirectoryIteratorImpl::~DirectoryIteratorImpl() { | ||
|
|
@@ -34,27 +34,29 @@ DirectoryIteratorImpl& DirectoryIteratorImpl::operator++() { | |
| } | ||
|
|
||
| if (ret == 0) { | ||
| entry_ = {"", FileType::Other}; | ||
| entry_ = {"", FileType::Other, 0}; | ||
| } else { | ||
| entry_ = {std::string(find_data.cFileName), fileType(find_data)}; | ||
| entry_ = makeEntry(find_data); | ||
| } | ||
|
|
||
| return *this; | ||
| } | ||
|
|
||
| FileType DirectoryIteratorImpl::fileType(const WIN32_FIND_DATA& find_data) const { | ||
| DirectoryEntry DirectoryIteratorImpl::makeEntry(const WIN32_FIND_DATA& find_data) { | ||
| ULARGE_INTEGER file_size; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should this all be in the final else?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call, now that it's unset everywhere else! |
||
| file_size.LowPart = find_data.nFileSizeLow; | ||
| file_size.HighPart = find_data.nFileSizeHigh; | ||
| uint64_t size = static_cast<uint64_t>(file_size.QuadPart); | ||
| if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) && | ||
| !(find_data.dwReserved0 & IO_REPARSE_TAG_SYMLINK)) { | ||
| // The file is reparse point and not a symlink, so it can't be | ||
| // a regular file or a directory | ||
| return FileType::Other; | ||
| } | ||
|
|
||
| if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { | ||
| return FileType::Directory; | ||
| return {std::string(find_data.cFileName), FileType::Other, 0}; | ||
| } else if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { | ||
| return {std::string(find_data.cFileName), FileType::Directory, 0}; | ||
| } else { | ||
| return {std::string(find_data.cFileName), FileType::Regular, size}; | ||
| } | ||
|
|
||
| return FileType::Regular; | ||
| } | ||
|
|
||
| } // namespace Filesystem | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.