- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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/
我有本地更改和远程更改。 有人告诉我必须先推,再 pull 。这背后有什么原因吗? 最佳答案 那个人错了:正确的模型是pull-before-you-push,而不是相反。 当您pull时,git 将
我正在使用最新版本的 Flat UI Pro 1.3.2 ( http://designmodo.com/flat/ ),jQuery 插件 flatui-radiocheck v0.1.0 和 iO
我是一名优秀的程序员,十分优秀!