gpt4 book ai didi

c++ - MFC 先处理文件再处理文件夹

转载 作者:行者123 更新时间:2023-11-30 02:23:18 24 4
gpt4 key购买 nike

我使用 MFC 以递归方式遍历文件夹结构以获取文件列表。这很好用,但是在处理文件时,我想先处理一个文件夹中的所有文件,然后再进入子文件夹。例如,如果我有以下层次结构:

\A.txt
\B.txt
\C\C1.txt
\C\C2.txt
\D.txt
\E.txt
\F\F1.txt
\F\F2.txt
\F\F3\F4.txt
\F\F3\F5.txt
\F\F6.txt
\G.txt
\H.txt
\I.txt
...

我想在进入\C 之前处理\(A.txt、B.txt、D.txt、E.txt 等)中的所有文件,在进入\F\F3 之前处理\F 中的所有文件.但是当我将这些文件收集到一个 std::vector 中时,该 vector 将完全按照上面的列表进行填充。我怀疑这是因为 Windows 操作系统的一些内部排序。然后,当我遍历 vector 并在“路径”部分发生变化时输出一条消息时,我得到类似于以下内容的信息:

Processing files in \
Processing files in \C
Processing files in \
Processing files in \F
Processing files in \F\F3
Processing files in \F
Processing files in \

当我更喜欢这样的东西时,这使得处理看起来好像在文件夹之间来回跳转:

Processing files in \
Processing files in \C
Processing files in \F
Processing files in \F\F3
...

并在移动到同级文件夹之前处理完整层次结构中的所有文件。本质上,消息应根据所使用的文件夹结构按字母顺序显示。

我想过使用 CFileFind::IsDirectory 来保存一个文件夹列表,直到整个文件夹都被遍历,然后进入每个保存的文件夹名称列表并遍历它(并在继续之前保存它自己的文件夹列表,等等) .),但这似乎有点矫枉过正。一定有更好的方法。

我当前的代码类似于以下代码,其中 iFound 是完整层次结构中所有文件的计数:

void GetFiles(CString& strSrcFolder, int& iFound)
{
CString strFileSpec(strSrcFolder);

if (strFileSpec.Right(1) != _T("\\"))
strFileSpec += "\\";

strFileSpec += _T("*.*");

CFileFind Search;
BOOL bFound = Search.FindFile(strFileSpec);

while (bFound) {
bFound = Search.FindNextFile();

if (Search.IsDots())
continue;

if (Search.IsDirectory()) {
if (m_oPrefs.Recurse())
GetFiles(Search.GetFilePath(), iFound);
else
continue;
}
else {
m_vFiles.push_back(Search.GetFilePath());
++iFound;
}
}

Search.Close();
}

我希望我已经使我想要完成的事情易于理解,但请不要犹豫,询问是否需要任何进一步的说明。 TIA。

最佳答案

根据你的描述你的实际伪代码是这样的:

ProcessDirectory(dir)
{
for all items in dir
{
if item is a file
{
ProcessFile(item)
}
else
{ // it's not a file, so it's a directory
ProcessDirectory(dir)
}
}
}

但是你需要这个:

ProcessDirectory(dir)
{
list directorylist

for all items in dir
{
if item is a file
{
ProcessFile(item)
}
else
{ // it's not a file, so it's a directory
add item to list
}
}

// now all files of the current directory (dir) have been processed

// now let's process the directories of the current directory (dir)
for all items in list
{
ProcessDirectory(item)
}
}

如您所见,除了列表之外,它几乎是一样的。这绝对不过分,我也没有看到任何更简单的方法。

对于列表,您可以使用例如 CStringArray MFC 类。

另一种方法是从 CFindFile 派生一个您自己的类,以确保在迭代过程中目录位于文件之后

关于c++ - MFC 先处理文件再处理文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com