如何在C++中将文件路径作为节点添加到树或堆栈中

How do I add file paths as nodes to a tree or stack in C++

本文关键字:节点 添加 堆栈 路径 C++ 文件      更新时间:2023-10-16

我有一个项目要使用数据结构(树、堆栈或队列)搜索、重命名或删除计算机上选定驱动器上的文件和文件夹。我的问题是,如何在C++中添加文件路径和目录作为节点?

另一个答案中的注释建议使用exec()函数之一。然后对输出进行解析和研究。

我赞成这个想法,但我发现使用popen()更容易。以下每个示例都是Linux API的一部分,因此调用是c兼容的,可以直接由c++使用。我预计popen()将在其他操作系统上可用。

为了澄清,

1) popen()是C++代码要调用的函数调用。

2) 您还需要为操作系统创建字符串来生成所需的列表,并将它们提交给popen()的调用。第一个参数是命令字符串

3) 在读取模式下,"ls-lsa"或"dir"命令的输出将被写入派生进程的输出管道,并且您的代码需要"吸收它",我建议将其捕获到std::stringstream。

4) 在捕获"dir-r"输出之后,解析并从字符串流中提取dir和文件名。


C++访问popen的示例:

FILE* m_pipe = nullptr; // popen return a FILE*

// use m_pipe to read from sub-process std::out
m_pipe = ::popen (m_cmd.c_str(), "r");  // read mode
//       ^^ because popen is not in a namespace

m_pipe = ::popen(m_cmd.c_str(), "w"); // write to sub-process std::in
int32_t pcloseStat = ::pclose(m_pipe);

{
   (void)memset(buff, 0, BUFF_SIZE);
   // Reads characters from stream and stores them as a C string
   // into buff until
   //    a) (BUFF_SIZE-1) characters have been read or
   //    b) a newline or
   //    c) the end-of-file is reached,
   // whichever happens first.
   char* stat = fgets (buff, BUFF_SIZE, m_pipe); // returns buff or null
   int myErrno = errno;               //^^^^^^ -- created by popen
}

为popen 1st参数构建linux命令的示例。。。

  std::string md5sumCmd ("head --bytes=1M " + mPFN +" | md5sum");

此命令获取mPFN中文件名的第一个1Megabyte(std::字符串),并将输出管道传输到md5sum。。。基本上生成文件的1s Meg的md5sum。md5sum输出将由调用进程接收。


您需要创建适当的命令(传递给popen)来显示目录、文件夹和文件名等。

从命令行运行的东西应该很好,但有些选项可能会使解析输出变得更容易。

对于基于节点的结构,添加一个字符串属性作为文件路径。但是,您可能需要将其中的"\"替换为"/",因为在大多数语言中,正斜杠通常是转义符。例如在队列中:

class Node {
Node next;
char[50] path;
}

您可以像创建类中的任何其他对象一样创建访问器和赋值器。这将允许您为其赋值并读取值。文件夹可以用作父文件夹,而文件是子文件夹。树状结构可能是最简单的方法。