如何在 C++ 中将文件路径作为节点添加到树或堆栈
How do I add file paths as nodes to a tree or stack in C++
我有一个项目可以使用数据结构(树、堆栈或队列)搜索、重命名或删除计算机上选定驱动器上的文件和文件夹。我的问题是,如何在 C++ 中将文件路径和目录添加为节点?
对于基于节点的结构,添加一个字符串 属性 作为文件路径。您可能需要将其中的“\”替换为“/”,因为正斜杠在大多数语言中通常是转义字符。例如在队列中:
class Node {
Node next;
char[50] path;
}
并且您可以像在 class 中创建任何其他内容一样创建访问器和修改器。这将允许您为其分配值并读取值。
文件夹可以用作父项,文件是子项。树结构可能是最简单的方法。
其他答案中的评论建议使用 exec() 函数之一。然后解析和研究输出。
我同意这个想法,但我发现使用 popen() 更容易。下面每个例子都是LinuxAPI的一部分,所以调用都是c兼容的,可以直接被C++使用。我希望 popen() 将在其他 OS 上可用。
澄清一下,
1) popen() 是供您的 C++ 代码调用的函数调用。
2) 您还需要为您的 OS 创建字符串以生成您想要的列表,并将它们提交给您对 popen() 的调用。第一个参数是命令字符串
3) 在读取模式下,您的 "ls -lsa " 或 "dir" 命令的输出将被写入衍生进程的输出管道,您的代码将需要 'suck it in' ,我建议将其捕获到 std::stringstream.
4) 在捕获 "dir -r" 输出后,然后从字符串流中解析并提取目录和文件名。
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 第一个参数构建 linux 命令的示例 ...
std::string md5sumCmd ("head --bytes=1M " + mPFN +" | md5sum");
此命令在 mPFN (a std::string) 中获取文件名的第一个 1Megabyte,并将其输出到 md5sum 中...实质上是生成文件的 1s Meg 的 md5sum。 md5sum 输出是调用进程将接收的内容。
您将需要创建适当的命令(以传递给 popen)来显示目录、文件夹和文件名等。
从命令行运行的应该没问题,但某些选项可能会使解析输出更容易。
我有一个项目可以使用数据结构(树、堆栈或队列)搜索、重命名或删除计算机上选定驱动器上的文件和文件夹。我的问题是,如何在 C++ 中将文件路径和目录添加为节点?
对于基于节点的结构,添加一个字符串 属性 作为文件路径。您可能需要将其中的“\”替换为“/”,因为正斜杠在大多数语言中通常是转义字符。例如在队列中:
class Node {
Node next;
char[50] path;
}
并且您可以像在 class 中创建任何其他内容一样创建访问器和修改器。这将允许您为其分配值并读取值。 文件夹可以用作父项,文件是子项。树结构可能是最简单的方法。
其他答案中的评论建议使用 exec() 函数之一。然后解析和研究输出。
我同意这个想法,但我发现使用 popen() 更容易。下面每个例子都是LinuxAPI的一部分,所以调用都是c兼容的,可以直接被C++使用。我希望 popen() 将在其他 OS 上可用。
澄清一下,
1) popen() 是供您的 C++ 代码调用的函数调用。
2) 您还需要为您的 OS 创建字符串以生成您想要的列表,并将它们提交给您对 popen() 的调用。第一个参数是命令字符串
3) 在读取模式下,您的 "ls -lsa " 或 "dir" 命令的输出将被写入衍生进程的输出管道,您的代码将需要 'suck it in' ,我建议将其捕获到 std::stringstream.
4) 在捕获 "dir -r" 输出后,然后从字符串流中解析并提取目录和文件名。
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 第一个参数构建 linux 命令的示例 ...
std::string md5sumCmd ("head --bytes=1M " + mPFN +" | md5sum");
此命令在 mPFN (a std::string) 中获取文件名的第一个 1Megabyte,并将其输出到 md5sum 中...实质上是生成文件的 1s Meg 的 md5sum。 md5sum 输出是调用进程将接收的内容。
您将需要创建适当的命令(以传递给 popen)来显示目录、文件夹和文件名等。
从命令行运行的应该没问题,但某些选项可能会使解析输出更容易。