【问题标题】:Listing the Files in a Directory WinApi列出目录 WinApi 中的文件
【发布时间】: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 是我唯一会避免使用的库。

标签: c++ file winapi


【解决方案1】:

... 是伪目录。语义为documented

  • 在路径中使用句点作为目录组件来表示当前目录,例如“.\temp.txt”。如需更多信息,请参阅Paths
  • 在路径中使用两个连续句点 (..) 作为目录 组件 来表示当前目录的父目录,例如“..\temp.txt”。如需更多信息,请参阅Paths

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2023-03-03
    • 1970-01-01
    • 2013-08-30
    • 2012-03-22
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多