【发布时间】:2020-03-19 23:13:19
【问题描述】:
在目录中我只有 3 个文件(poem.txt、mac.txt、some_file.txt)。
为什么在我的输出中有 2 个名称为“.”的奇怪文件和“..”?
那是什么?
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main()
{
WIN32_FIND_DATA fileData;
HANDLE hFind = FindFirstFile(L"D:\\Univesity\\PROJECTS\\OS_Course\\poem_old\\*", &fileData);
if (hFind != INVALID_HANDLE_VALUE) {
do {
//wcout << fileData.cFileName << endl;
WIN32_FIND_DATA compared_fileData;
HANDLE compared_hFind = FindFirstFile(L"D:\\Univesity\\PROJECTS\\OS_Course\\poem2_new\\*", &compared_fileData);
if (compared_hFind != INVALID_HANDLE_VALUE) {
do {
//wcout << (wstring) fileData.cFileName << endl << (wstring) compared_fileData.cFileName;
if ( (wstring) fileData.cFileName == (wstring) compared_fileData.cFileName) {
FILETIME fileWriteTime = fileData.ftLastWriteTime;
FILETIME compared_fileWriteTime = compared_fileData.ftLastWriteTime;
/*
-1 First file time is earlier than second file time.
0 First file time is equal to second file time.
1 First file time is later than second file time.
*/
int comparationResult = CompareFileTime(&fileWriteTime, &compared_fileWriteTime);
if (comparationResult == 1) {
wcout << "Comparation: " << (wstring)fileData.cFileName << " is later than " << (wstring)compared_fileData.cFileName << endl;
}
else if (comparationResult == -1) {
wcout << "Comparation: " << (wstring)fileData.cFileName << " is earlier than " << (wstring)compared_fileData.cFileName << endl;
}
}
} while (FindNextFile(compared_hFind, &compared_fileData));
}
} while (FindNextFile(hFind, &fileData));
FindClose(hFind);
}
}
输出:
比较:.晚于 .
比较:.. 晚于 ..
对比:black.txt 早于 black.txt
对比:mac.txt 早于 mac.txt
比较:some_file.txt 比 some_file.txt 晚
【问题讨论】:
-
在命令提示符下键入
dir。.是当前目录,..是父目录。 -
旁注:您真的需要 WinAPI 中的一些特殊功能来执行此操作吗?为什么不使用
std::filesystem(自 C++17 起可用)? -
@TedLyngmo 我通常不使用 C++,所以我对它知之甚少。感谢您的建议。
-
@TedLyngmo:
std::filesystem::diretory_iterator可以处理这种特殊情况。然而,总的来说,它有很多妥协,归结为 Windows 和 Posix 样式文件系统的最小公分母包装器,使得很难做原生 API 所做的事情,比如通配符的一致应用、处理长文件名和 8.3 文件名,以及某些类型的高效搜索。 -
@ted:我的观点是文件系统在不同平台之间变化太大,像 “正常操作” 这样的东西根本不存在。我可能用过所有的 C++,
std::filesystem是我唯一会避免使用的库。