【问题标题】:How can i get the listing of files and directories of a path using C++?如何使用 C++ 获取路径的文件和目录列表?
【发布时间】:2011-03-14 07:00:53
【问题描述】:

我正在使用目录类来获取此信息,但无法将此数据分配给我自己的类的数据成员。我正在做一个 oop 项目。此外,我想使用Dynamism(containment)的概念。我创建了两个类,mydirectory和myfiles,如下:

class files
{
    string fname[25];
public:
    files()
    {
      fname=NULL;
    }

};

class directory
{ private:
    directory *d;
    string *dname[25];   //* to show there may be a subdirectory,there may be not.
    files *ff[25];       // data member string *fname[25];
int numd,numf;
public:
    directory()
    {
    numd=0;numf=0;
    }

现在如果我想使用该语句:

 Directory::GetDirectories("D:\\"); 

如何将目录名称分配给目录类的“dname”。

我不想包含第三方软件。

我还需要有关该主题的帮助:如何从控制台外部的 c++ 代码打开文件(doc 文件/pdf/txt/pwt 等)?我非常担心。请帮我。提前致谢。

我是 C++ 新手,所以如果在指针处理中出现任何错误,请原谅,因为我是第一次这样做。我还需要一些阅读材料。

【问题讨论】:

  • 这是真实的代码吗?语句 fname=NULL 不会编译。
  • C++ 没有列出文件和目录的标准机制——它因操作系统而异。您的目标是什么操作系统?
  • 我之前说过,可能会有一些可怕的错误:(。如果你有兴趣,请帮忙删除它们。我是为 Windows 做的。
  • 如果你不能解决这些基本的编译问题,那么继续进行下去是没有意义的。我建议你在尝试这样的事情之前阅读 C++ 书籍。

标签: c++ visual-c++ file-io directoryinfo


【解决方案1】:

在 C++ 中最简单的方法是使用 boost::filesystem。

只要路径是目录,您就可以使用 directory_iterator 或 recursive_directory_iterator 对其进行迭代。

例如:

boost::filesystem::path dirname( "D:\\" );

std::vector<boost::filesystem::path> topLevel( directory_iterator(dirName), 
      directory_iterator() );

std::vector<boost::filesystem::path> wholeDrive( 
       recursive_directory_iterator(dirName), recursive_directory_iterator() );

【讨论】:

  • 他说:“我不想包含第三方软件。”我想这将包括提升。
【解决方案2】:

由于这是标记为作业,我们不会通过提供正确答案来帮助您。但我会为你指明正确的方向。

您已经表明您在 Visual C++ 下执行此操作。好吧,不使用任何第三方库,只使用内置库,您需要访问 Win32 API。

FindFirstFile() & FindNextFile() 是你需要的。

您将首先调用 FindFirstFile 来获取目录句柄。 参数是你传递给你的类的 D:\。

然后在while循环中调用FindNextFile。

例如使用这些 API 的基本原则是

HANDLE h = FindFirstFile("D:\\");
WIN32_FIND_DATA data;
while (FindNextFile(h, &data))
{
   // Check if it's a directory or not
   if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
     // Add to dname
   }
}

考虑使用 std::vector 作为你的 dname 而不是 string* 因为你被 25 个条目困住了。使用矢量它会为你成长。

【讨论】:

    【解决方案3】:

    正如 CashCow 所说,boost::filesystem

    作为一般规则,在 C++ 中,对于此类示例,您不需要任何指针。这里有一些你应该纠正的错误:

    string fname[25];
    

    这声明了一个包含 25 个字符串的数组。您可能想要一个 25 个字符的字符串?好吧,在 std::string 中,您不需要关心长度。 std::string fname;够了

    std::string file_name;
    file_name = "baz.txt";
    
    fname=NULL;
    

    如果 fname 是一个字符串,那么它不是一个指针。所以你不能给它分配NULL。 std::string 默认初始化为空字符串。您可以将整个构造函数排除在外。

    string *dname[25]
    

    我想你想要一个字符串数组。只需使用:

    std::vector<std::string> dnames;
    dnames.push_back("foo");
    dnames.push_back("bar"); // dnames now contains {"foo","bar"}
    

    您将拥有一个可动态调整大小的字符串向量。

    见:不需要任何指针。不需要任何新的

    【讨论】:

      【解决方案4】:

      最后我完成了这个简短的项目。为了获取文件和子目录的列表,我使用了.NET Framework namespace "System"。它有像“FileInfo”和“DirectoryInfo”这样的类(都属于@987654326 @) 完成上述要求的任务。但是在这里,所有与字符串相关的东西都是System::String,而不是std::string。要将System::String转换为std::string,我使用了以下代码(我得到了这个转换的代码来自论坛,它运行良好,没有任何错误):

      string Str2str(String ^a)
      {
      array<Byte> ^chars = System::Text::Encoding::ASCII->GetBytes(a);
      pin_ptr<Byte> charsPointer = &(chars[0]);
      char *nativeCharsPointer = reinterpret_cast<char *>(static_cast<unsigned char *>(charsPointer));
      string native(nativeCharsPointer, chars->Length);
      return native;
      }
      

      这是从驱动器获取子目录列表的简短代码(D:驱动器将被搜索):

       #include<iostream>
              #using<mscorlib.dll>
              using namespace strd;        
              using namespace System;
              using namespace System::IO;
      
      
      int main()
          {int count=50;
      string name[count];//to hold directories names
      string b;
      int s=0;
      DirectoryInfo^ di = gcnew DirectoryInfo("d:\\");
      if(di->Exists)
      {array<DirectoryInfo^>^diArr = di->GetDirectories();
      Collections::IEnumerator^ myEnum = diArr->GetEnumerator();
      while ( myEnum->MoveNext() )
      {DirectoryInfo^ dri = safe_cast<DirectoryInfo^>(myEnum->Current);
      
      
            String ^a=(dri->Name->ToString());
            int n=b.size();
            b=Str2str(a); `// code given in the starting`
            if (s<count)
            {name[s]=b;
            s++;}
      
      }
      

      这涉及托管 C++ 知识。访问这些:

      .NET Programming Guide

      C++: The Most Powerful Language for .NET Framework Programming

      我在 Visual Studio 2008 上编译了这个。如果您对我的努力表示赞赏,我将不胜感激。欢迎提出进一步的建议。

      【讨论】:

      • 在 MSDN 中搜索有关 DirectoryInfo 和 FileInfo 的信息。
      • 这不是很漂亮的代码,但它是家庭作业,你说它有效。我建议的更简单。请注意,如果您使用 .NET 分发二进制文件,则某些平台(如 Windows XP)可能需要安装 .NET 运行时。这大约是 100+MB 的内存。仅几个 .NET 功能就会产生大量开销。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多