Opened 9 years ago
Last modified 9 years ago
#8946 new Bugs
filesystem::directory_iterator returns incorrect listing
Reported by: | Owned by: | Beman Dawes | |
---|---|---|---|
Milestone: | To Be Determined | Component: | filesystem |
Version: | Boost 1.54.0 | Severity: | Problem |
Keywords: | directory_iterator | Cc: |
Description
Both directory_iterator and recursive_directory_iterator do not work correctly under linux with g++-4.7.3 : one item, assumed to be the last one, is not listed.
Simple code to reproduce the problem :
#include <iostream> #include <stdio.h> #include <boost/filesystem.hpp> using namespace std; namespace bfs = boost::filesystem; int main () { system("mkdir mydir"); system("touch mydir/file1"); system("touch mydir/file2"); bfs::directory_iterator bfs_dir_i_end; bfs::directory_iterator bfs_dir_i("mydir/."); while (++bfs_dir_i != bfs_dir_i_end) { bfs::file_type type = (*bfs_dir_i).status().type(); bfs::path source = (*bfs_dir_i).path(); cout << source << " " << type << endl; } }
Build with :
g++-4.7.3 -I/usr/include/crypto++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 show_bug_directory_iterator.cpp g++-4.7.3 -lboost_filesystem -o show_bug_directory_iterator show_bug_directory_iterator.o
Code result :
$ ./show_bug_directory_iterator "mydir/./file1" 2
Should be :
$ ./show_bug_directory_iterator "mydir/./file1" 2 "mydir/./file2" 2
Shell result :
$ ls -lR . .: total 1620 drwxr-xr-x 2 alain alain 4096 31 juil. 10:48 mydir -rwxr-xr-x 1 alain alain 639766 31 juil. 10:48 show_bug_directory_iterator -rw-r--r-- 1 alain alain 497 31 juil. 10:44 show_bug_directory_iterator.cpp -rw-r--r-- 1 alain alain 1006376 31 juil. 10:48 show_bug_directory_iterator.o ./mydir: total 0 -rw-r--r-- 1 alain alain 0 31 juil. 10:48 file1 -rw-r--r-- 1 alain alain 0 31 juil. 10:48 file2
Notes :
1) Not tested under other gcc versions.
2) Tested with same results on Boost 1.52.0 and 1.53.0
3) suspected regression, cf https://svn.boost.org/trac/boost/ticket/257
Change History (4)
follow-up: 2 comment:1 by , 9 years ago
Version: | Boost 1.53.0 → Boost 1.54.0 |
---|
comment:2 by , 9 years ago
comment:3 by , 9 years ago
You need to increment bfs_dir_i after all of the actions in the loop:
#include <iostream> #include <stdio.h> #include <boost/filesystem.hpp> using namespace std; namespace bfs = boost::filesystem; int main () { system("mkdir mydir"); system("touch mydir/file1"); system("touch mydir/file2"); bfs::directory_iterator bfs_dir_i_end; bfs::directory_iterator bfs_dir_i("mydir"); while (bfs_dir_i != bfs_dir_i_end) { bfs::file_type type = (*bfs_dir_i).status().type(); bfs::path source = (*bfs_dir_i).path(); cout << source << " " << type << endl; ++bfs_dir_i; } }
comment:4 by , 9 years ago
Thanks nikita. The documentation should be modified then (http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#Class-directory_iterator):
To iterate over the current directory, use directory_iterator(".")
This lead me to increment first the iterator.
Replying to anonymous: Sorry, change made by myself. So, same result on versions 1.52.0, 1.53.0, and 1.54.0