mirror of
https://github.com/boostorg/filesystem.git
synced 2025-05-12 13:41:47 +00:00
Directory iteration components were moved to separate files to simplify maintenance of operations.hpp/cpp. directory_iterator implementation on POSIX platforms has been reworked to only allocate internal buffer when readdir_r is used. When readdir is used, the dirent structure returned by readdir is used directly, which eliminates the potential of buffer overrun in case if some directory name exceeds the buffer size. This also removes the need to copy dirent members into the buffer, which improves performance and simplifies maintenance. For buffer size we now use the max path size as opposed to max filename size. This is done to minimize the possibility of buffer overruns when readdir_r is used. On Windows, use Boost.WinAPI to configure the default target Windows version. This removes WINVER and _WIN32_WINNT defines in Boost.Filesystem as these macros should be defined by Boost.WinAPI now. Additionally, exception.hpp and directory.hpp includes in operations.hpp are marked as deprecated as operations.hpp do not need those components. Users are encouraged to include the new headers explicitly in their code, as needed.
93 lines
2.3 KiB
C++
93 lines
2.3 KiB
C++
// simple_ls program -------------------------------------------------------//
|
|
|
|
// Copyright Jeff Garland and Beman Dawes, 2002
|
|
|
|
// Use, modification, and distribution is subject to the Boost Software
|
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
// See http://www.boost.org/libs/filesystem for documentation.
|
|
|
|
#define BOOST_FILESYSTEM_VERSION 3
|
|
|
|
// As an example program, we don't want to use any deprecated features
|
|
#ifndef BOOST_FILESYSTEM_NO_DEPRECATED
|
|
# define BOOST_FILESYSTEM_NO_DEPRECATED
|
|
#endif
|
|
#ifndef BOOST_SYSTEM_NO_DEPRECATED
|
|
# define BOOST_SYSTEM_NO_DEPRECATED
|
|
#endif
|
|
|
|
#include <boost/filesystem/operations.hpp>
|
|
#include <boost/filesystem/directory.hpp>
|
|
#include <boost/filesystem/path.hpp>
|
|
#include <iostream>
|
|
|
|
namespace fs = boost::filesystem;
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
fs::path p(fs::current_path());
|
|
|
|
if (argc > 1)
|
|
p = fs::system_complete(argv[1]);
|
|
else
|
|
std::cout << "\nusage: simple_ls [path]" << std::endl;
|
|
|
|
unsigned long file_count = 0;
|
|
unsigned long dir_count = 0;
|
|
unsigned long other_count = 0;
|
|
unsigned long err_count = 0;
|
|
|
|
if (!fs::exists(p))
|
|
{
|
|
std::cout << "\nNot found: " << p << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
if (fs::is_directory(p))
|
|
{
|
|
std::cout << "\nIn directory: " << p << "\n\n";
|
|
fs::directory_iterator end_iter;
|
|
for (fs::directory_iterator dir_itr(p);
|
|
dir_itr != end_iter;
|
|
++dir_itr)
|
|
{
|
|
try
|
|
{
|
|
if (fs::is_directory(dir_itr->status()))
|
|
{
|
|
++dir_count;
|
|
std::cout << dir_itr->path().filename() << " [directory]\n";
|
|
}
|
|
else if (fs::is_regular_file(dir_itr->status()))
|
|
{
|
|
++file_count;
|
|
std::cout << dir_itr->path().filename() << "\n";
|
|
}
|
|
else
|
|
{
|
|
++other_count;
|
|
std::cout << dir_itr->path().filename() << " [other]\n";
|
|
}
|
|
|
|
}
|
|
catch (const std::exception & ex)
|
|
{
|
|
++err_count;
|
|
std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
|
|
}
|
|
}
|
|
std::cout << "\n" << file_count << " files\n"
|
|
<< dir_count << " directories\n"
|
|
<< other_count << " others\n"
|
|
<< err_count << " errors\n";
|
|
}
|
|
else // must be a file
|
|
{
|
|
std::cout << "\nFound: " << p << "\n";
|
|
}
|
|
|
|
return 0;
|
|
}
|