在C ++中给出Path的文件列表

时间:2015-06-14 17:20:59

标签: c++ file directory

我正在尝试创建一个随机选择给定基本路径的文件夹的程序,然后在新文件夹中随机选择要打开的视频并开始播放。

我的主要问题是查找给定路径中的文件数。有没有可以做类似的功能?还是类似的? 我需要什么样的标题?等。

随机部分很容易。在解决了这个问题后,我想知道我是否能够在执行程序时启动视频,这应该是我程序的最后一步。

在发布之前我已经搜索了很多,我知道你可能认为它已经存在了,但我找不到足够的东西来满足我想要的东西。

我希望你能帮助我。

3 个答案:

答案 0 :(得分:2)

你应该研究boost.filesystem。没有boost的C ++(或其他库集,如Qt)的功能非常有限。

an example in doc

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";

        copy(directory_iterator(p), directory_iterator(), // directory_iterator::value_type
          ostream_iterator<directory_entry>(cout, "\n")); // is directory_entry, which is
                                                          // converted to a path by the
                                                          // path stream inserter
      }

      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;
}

当然,您可以使用directory_iterator内部&#34;用于&#34;循环:

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

using namespace boost::filesystem;

int main(int argc, char *argv[])
{
    path p(argc > 1? argv[1] : ".");

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

        for(auto& entry : boost::make_iterator_range(directory_iterator(p), {}))
            std::cout << entry << "\n";
    }
}

答案 1 :(得分:0)

您显然需要修改此功能以使其适合您。但这是我能够找到并制作的功能。我认为它需要windows.h。它的作用是将Bin / Pictures中所有文件的文件名添加到名为mTextureNames的向量中。

 void Editor::LoadTextureFileNames()
    {   
        string folder = "../Bin/Pictures/";
        char search_path[200];
        sprintf(search_path, "%s*.*", folder.c_str());
        WIN32_FIND_DATA fd; 
        HANDLE hFind = ::FindFirstFile(search_path, &fd); 
        if(hFind != INVALID_HANDLE_VALUE) { 
            do { 
                // read all (real) files in current folder
                // , delete '!' read other 2 default folder . and ..
                if(! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) {
                    this->mTextureNames.push_back(fd.cFileName);
                }
            }while(::FindNextFile(hFind, &fd)); 
            ::FindClose(hFind); 
        } 
    }

答案 2 :(得分:0)

  

我的主要问题是找到给定路径中的文件数。

虽然函数glob called is C,如果您的C ++编译器与C兼容,它不应该成为问题。您可以始终将其包装在C ++中:) Man glob描述了如何使用它。 GLOB_ONLYDIR允许您将结果限制为目录。

播放视频的最简单方法是致电system()并在您喜爱的播放器中执行视频