如何在FindNextFileW中跳过点(。)和点(..)?

时间:2019-06-13 22:19:01

标签: c++ windows winapi

我正在使用FindNextFileW成功列出目录中的文件。问题在于它使用.引用自身,当前目录,并使用..引用父目录。我正在尝试使用if条件跳过这些,但仍会打印它们。

代码:

int wmain() {

WIN32_FIND_DATAW data;
std::wstring dir = L"c:\\* ";
HANDLE hFind = FindFirstFileW(dir.c_str(), &data);

if (hFind != INVALID_HANDLE_VALUE) {
    do {
        wchar_t dot[] = L"." ;
        wchar_t dotd[] = L"..";

        if ( data.cFileName != dot && data.cFileName != dotd)
        std::wcout << data.cFileName << std::endl;
    } while (FindNextFileW(hFind, &data));
    FindClose(hFind);
}
return 0;
}

如您所见,我正在尝试通过使用.条件来跳过..if的打印。但是,它仍然打印它们。我在做什么错以及如何解决?

编辑:

这个问题不是关于如何比较wchar_t数组。很高兴知道,但是最终我的问题是如何跳过.中的..FindNextFileW。我尝试转换为std::wstring,但随后可以定义:

std::wstring dot = '.';
std:wstring dotd = '..';

但是我如何对照cFilename检查它们?

2 个答案:

答案 0 :(得分:5)

您只是在比较指针,它们将永远不会相同。 data.cFileName不是std::[w]string,它只是一个纯C样式的字符串。

您可以使用lstrcmpW(),但是它们太短了,您甚至不必这样做,只需手动检查字符或使用辅助功能即可。

template<class T> bool IsDotOrDotDot(const T*s)
{
  if (s[0] == T('.'))
  {
    if (s[1] == T('\0')) return true; // .
    if (s[1] == T('.') && s[2] == T('\0')) return true; // ..
  }
  return false;
}

...

do {
  if (!IsDotOrDotDot(data.cFileName))
  {
    ...
  }
} while (...);

答案 1 :(得分:4)

您可以这样做:

comments

还请注意:

class Details extends Component {
  constructor() {
    super();


    this.state = {
      resul: []
      selectTodo:[]
    }; 
  }

  componentDidMount() {
    axios.get(" http://....../todos")
      .then(response => {
        this.setState({
          resul: response.data,
          selectTodo: this.props.selected
        });
      })
      .catch(error => {
        console.log('Error fetching and parsing data', Error);
      }
    );
  }


  render () {

    return (
      <div>    
        {
          { 
              this.state.selectTodo.comments.map((obj, i) => {
                return <li>{obj["comment"]}</li>
              })  
            } 
        }
      </div>      
    );
  }
}



export default Details;

应为:

 console.log(this.state.selectTodo);


 return:


Object
  comments: (2) [{'comment': 'sdsd'}, {'comment': 'sdsdsdsds'}]
  id: 1

,对于if (wcscmp (data.cFileName, dot) != 0 && wcscmp (data.cFileName, dotd) != 0) ... 同样如此。

如果使用C ++ 17,您可能还想研究std::filesystem