我正在使用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
检查它们?
答案 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