Opened 9 years ago
Last modified 7 years ago
#9824 assigned Bugs
boost::filesystem::is_empty() doesn't work with symlinks on Windows
| Reported by: | Owned by: | Beman Dawes | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | filesystem |
| Version: | Boost 1.56.0 | Severity: | Regression |
| Keywords: | Cc: |
Description
See the original information on this problem in this Stackoverflow question:
hxxp://stackoverflow.com/questions/22668337/boostfilesystemis-empty-returns-false-for-symlinks
The person who reported that problem/asked the question on Stackoverflow also set up a github project that demonstrates the problem:
hxxps://github.com/monsdar/BoostSymLinkError
Basically, the filesystem::is_empty() function doesn't follow a symlink, so it will return false even if the target of the symlink has a length greater than 0.
The V2 filesystem library worked for this situation. The difference is that V2 used the stat() function in the VC++ library, while the V3 filesystem library uses the Win32 GetFileAttributesExW() API. The latter does not follow symlinks and returns a file size of 0 regardless of the size of the symlink target.
Attached is a diff for libs/filesystem/src/operations.cpp which uses the stat() technique very similar to what was used in filesystem V2. A few differences:
_wstat()is used instead ofstat()to accommodate UNICODE filenames- a bit test using
_S_IFDIRis used to determine if the path is a directory instead ofS_ISDIR()because the VC++ library doesn't include aS_ISDIR()or_S_ISDIR()macro.
This patch is only lightly tested (MSVC++ 12.0, 32-bit, on Win7 x64, filenames with ASCII characters only). I'm not sure what the motivations for changing to the GetFileAttributesExW() API in filesystem V3 were, so I'm not sure if there's a fundamental flaw in using _wstat() that would prevent using it in V3.

Possible fix for is_empty() symlink support