如何使用C ++获取路径的文件和目录列表?

时间:2011-03-14 07:00:53

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

我正在使用目录类来获取此信息,但无法将此数据分配给我自己的类的数据成员。我正在做一个oop项目。此外,我想使用动态(包容)的概念。我创建了两个类,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 file / pdf / txt / pwt等)?我非常担心。请帮我。提前谢谢。

我是c ++的新手所以请原谅指针处理中是否有任何错误,因为我是第一次做这个包含。我还需要一些阅读材料。

4 个答案:

答案 0 :(得分: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() );

答案 1 :(得分:1)

由于这是标记的家庭作业,我们不会通过给你正确的答案来帮助你。但我会指出你正确的方向。

你已经表明你在Visual C ++下这样做了。好吧,如果不使用任何第三方库,只是内置的内容,您将需要访问Win32 API。

FindFirstFile()&amp; FindNextFile()就是您所需要的。

首先调用FindFirstFile以获取目录句柄。 参数是您传递给班级的D:\。

然后在while循环中调用FindNextFile。

e.g。使用这些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个条目。使用矢量它会为你成长。

答案 2 :(得分:0)

如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"}

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

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

答案 3 :(得分:0)

最后我完成了短项目。为了得到文件和子目录的列表,我使用了.NET Framework namespace "System"。它有类似&#34; FileInfo&#34;和&#34; DirectoryInfo&#34;(都属于System::IO)执行上述所需任务。但是,此处所有与字符串相关的内容都是System::String,而不是std::string {1}}。要将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上编译了这个。如果你赞美我的努力,我将非常感激。最热烈的建议是最受欢迎的。