如果未设置 Archive 属性且设置了 Index 属性,CComboBox::Dir 函数不会列出目录

发布于 2024-12-02 23:19:27 字数 338 浏览 0 评论 0原文

我正在使用 CComboBox::Dir(DDL_READWRITE, path) 来填充组合框的内容。一切都很好,但是当我重置 Archive 标志并设置 Index 标志时,Dir() 不返回任何文件。 使用

attrib -A *.*
attrib +I *.*

我正在列出的目录中 。我尝试将第一个参数更改为 Dir() 函数,但没有帮助。我已经尝试过 FindFirstFile()/FindNextFile() 并且它们工作正常 有

什么想法可以解释这种行为的原因吗? 这可能是 Dir() 函数中的错误吗?如果有的话,它还能起到什么其他作用? 如何解决这个问题呢?

I am using CComboBox::Dir(DDL_READWRITE, path) to populate the contents of a combobox. Everything is fine, but when I reset the Archive flag and set the Index flag, the Dir() returns no files. I am using

attrib -A *.*
attrib +I *.*

in the directory I am listing. I have tried changing the first parameter to Dir() function but it does not help. I have tried FindFirstFile()/FindNextFile() and they are working fine

Any ideas to explain the reason of this behavior?
Could this a bug in the Dir() function? If yes, what other functions could it effect?
How to solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落花浅忆 2024-12-09 23:19:27

这是一个非常有趣的问题。我在 Win 7 64 位上将其调试到 comctl32.dll ListBox_DirHandler 汇编代码中,发现 Windows 正在执行类似的操作(只是一些简化的代码):

// attr is the low word of the parameter passed to CComboBox::Dir.
attr &= FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
attr |= FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY;

WIN32_FIND_DATA finddata;
FindFirstFile(..., &finddata)
while(...) {
  if(finddata.dwFileAttributes == FILE_ATTRIBUTE_COMPRESSED)
    finddata.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
  if(finddata.dwFileAttributes & attr) {
    // some more checks and then might add the file name to the control;
  }
  FindNextFile(..., &finddata);
}

问题是您的文件返回时带有 <代码>finddata.dwFileAttributes==FILE_ATTRIBUTE_NOT_CONTENT_INDEXED。在函数入口处 attr 被更改,以便它永远不会设置 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,因此循环内的 if 永远不会为 true,并且文件名永远不会添加到控件中。

抱歉,但据我所知,您将不得不等待 MS 错误修复或自己完成工作。

This is quite an interesting issue. I debugged it on Win 7 64 Bit down into comctl32.dll ListBox_DirHandler assembler code and found out that Windows is doing something like this (just some simplified code):

// attr is the low word of the parameter passed to CComboBox::Dir.
attr &= FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
attr |= FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY;

WIN32_FIND_DATA finddata;
FindFirstFile(..., &finddata)
while(...) {
  if(finddata.dwFileAttributes == FILE_ATTRIBUTE_COMPRESSED)
    finddata.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
  if(finddata.dwFileAttributes & attr) {
    // some more checks and then might add the file name to the control;
  }
  FindNextFile(..., &finddata);
}

The problem is that your file is returned with finddata.dwFileAttributes==FILE_ATTRIBUTE_NOT_CONTENT_INDEXED. At entry of the function attr is changed so that it can never have FILE_ATTRIBUTE_NOT_CONTENT_INDEXED set, so the if inside the loop will never be true and the file name never be added to the control.

Sorry, but as far as I can see you will have to wait for an MS bugfix or do the work yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文