0

我正在使用目录类来获取此信息,但无法将此数据分配给我自己的类的数据成员。我正在做一个 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 文件/pdf/txt/pwt 等)?我非常担心。请帮我。提前致谢。

我是 C++ 新手,所以如果指针处理有任何错误,请原谅,因为我是第一次进行这种包含。我还需要一些阅读材料。

4

4 回答 4

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() );
于 2011-03-14T08:23:34.117 回答
1

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

您已经表明您在 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
   }
}

考虑为您的 dname 使用 std::vector 而不是 string*,因为您遇到了 25 个条目。使用矢量它会为你成长。

于 2011-04-18T03:10:31.963 回答
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"}

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

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

于 2011-03-14T08:40:53.423 回答
0

最后我完成了这个简短的项目。为了获取文件和子目录的列表,我使用了。.NET Framework namespace "System"它有像 " FileInfo" 和 " DirectoryInfo"(都属于System::IO)这样的类来完成上述要求的任务。但是在这里,所有的字符串相关的东西是System::String,而不是。要std::string转换System::Stringstd::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 编程指南

C++:.NET Framework 编程最强大的语言

我在 Visual Studio 2008 上编译了此文件。如果您感谢我的努力,我将不胜感激。非常欢迎您提出进一步的建议。

于 2011-04-18T02:35:56.020 回答