повысить версию файловой системы 3? - PullRequest
1 голос
/ 17 мая 2011

пример кода на веб-сайте Boost не работает. http://www.boost.org/doc/libs/1_46_1/libs/filesystem/v3/doc/tutorial.html#Using-path-decomposition

int main(int argc, char* argv[])
{
  path p (argv[1]);   // p reads clearer than argv[1] in the following code

  try
  {
    if (exists(p))    // does p actually exist?
    {
      if (is_regular_file(p))        // is p a regular file?   
        cout << p << " size is " << file_size(p) << '\n';

      else if (is_directory(p))      // is p a directory?
      {
        cout << p << " is a directory containing:\n";

        typedef vector<path> vec;             // store paths,
        vec v;                                // so we can sort them later

        copy(directory_iterator(p), directory_iterator(), back_inserter(v));

        sort(v.begin(), v.end());             // sort, since directory iteration
                                          // is not ordered on some file systems

        for (vec::const_iterator it (v.begin()); it != v.end(); ++it)
        {
          path fn = it->path().filename();   // extract the filename from the path
          v.push_back(fn);                   // push into vector for later sorting
        }
      }

      else
        cout << p << " exists, but is neither a regular file nor a directory\n";
    }
    else
      cout << p << " does not exist\n";
  }

  catch (const filesystem_error& ex)
  {
    cout << ex.what() << '\n';
  }

  return 0;
} 

два сообщения об ошибке при компиляции в Visual Studio 2010 для строки path fn = it->path().filename();

Первая ошибка: 'function-style cast' : illegal as right side of '->' operator, а вторая ошибка: left of '.filename' must have class/struct/union

Кроме того, когда я наводю курсор мыши на путь (), он говорит: class boost::filesystem3::path Error: typename not allowed

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Этот раздел (тело for) проблематичен:

  path fn = it->path().filename();   // extract the filename from the path
  v.push_back(fn);                   // push into vector for later sorting
  1. it указывает на path объекты, поэтому я не понимаю, почему вызывается path(). Кажется, его следует заменить на it->filename()
  2. Вы нажимаете имена файлов в конце того же вектора, поэтому после цикла у вас будет вектор, содержащий список файлов дважды , сначала с путями, а затем только с именами файлов.

РЕДАКТИРОВАТЬ : Глядя на оригинальный пример, я вижу, что это ваша модификация. Если вы хотите сохранить имена файлов вместо их печати, определите другой вектор string или path и сохраните в нем имена файлов, не используйте первый. И удаление вызова на path() должно решить проблему компиляции.

РЕДАКТИРОВАТЬ 2 : как симпатичный BTW, вы можете добиться как обхода каталога, так и извлечения имени файла за один проход, используя std::transform вместо std::copy:

struct fnameExtractor {  // functor
  string operator() (path& p) { return p.filename().string(); }
};

vector<string> vs;
vector<path> vp;
transform(directory_iterator(p), directory_iterator(), back_inserter(vs),
          fnameExtractor());

То же самое с использованием mem_fun_ref вместо fnameExtractor функтора:

transform(directory_iterator(p), directory_iterator(), back_inserter(vp),
          mem_fun_ref(&path::filename));
0 голосов
/ 17 мая 2011

После того, как вы разместили ссылку, кажется, что опубликованный код работает нормально. Но проблема вносится в модифицированный код в цикле for. Первая проблема в том, что path() является конструктором. 2-я проблема, я не уверен, что boost :: path содержит какой-либо метод как filename(). Вы можете попробовать,

path fn = (*it);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...