【问题标题】:Cannot find seekdir() in dirent.h for Windows (C++)在 Windows 的 dirent.h 中找不到 seekdir() (C++)
【发布时间】:2016-12-25 00:57:54
【问题描述】:


我实际上正在做一个项目,我必须浏览目录,为此我正在使用 dirent.h 库,因为我不想仅仅为此使用 Boost。
因此,我找到了这篇帖子<dirent.h> in visual studio 2010 or 2008,它指向这里http://www.softagalleria.net/dirent.php,我在那里下载并安装了dirent.h。
所以安装了dirent.h,使用opendir、readdir等基本函数没有问题,但是当我想使用seekdir()函数时,库中似乎不存在它,所以我进入dirent.h来验证我的假设并且(感谢 Ctrl+F)seekdir 确实丢失了。
我错过了什么还是我必须找到一个技巧来获得这个功能......?
谢谢你。

【问题讨论】:

  • 您想了解头文件之间的区别。下载标题是不够的。
  • 你能解释一下吗?我的意思是我遵循了这个小教程,我可以使用 dirent.h 中的函数,这些函数实际上可以工作:/
  • 它是只有头文件的库,所以只需要一个 .h 文件。看来seekdir作者根本就没有实现。
  • @Ari0nhh 我也在寻找其他实现,看来 seekdir 只是没有实现:/
  • 如果您的编译器是最新的,您可以通过设置编译器选项来打开 C++17 的文件系统支持以获取实验性的预标准化库。除此之外,它是一个像已经被拒绝的 boost 一样的可移植库。

标签: c++ c windows dirent.h


【解决方案1】:

该标头中唯一可用的功能是:

DIR *opendir (const char *dirname);
struct dirent *readdir (DIR *dirp);
int closedir (DIR *dirp);
void rewinddir (DIR* dirp);

获得所需功能没有任何技巧。您只需要为此找到另一个库。

【讨论】:

    【解决方案2】:

    如果您找不到头文件dirent.h,请尝试使用WIN32_FIND_DATAFindFirstFile()FindNextFile() 作为替代。提交了两个不同的代码。一个用于 Visual Studio 6.o,另一个用于需要使用宽字符的 Visual Studio 2013。

    Visual Studio 6.0 的代码:

    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    
    void listdirandfiles(string dir){
        HANDLE hFind;
        WIN32_FIND_DATAA data;
    
        hFind = FindFirstFileA(dir.c_str(), &data);
        if (hFind != INVALID_HANDLE_VALUE) {
            do {
                printf("%s\n", data.cFileName);
            } while (FindNextFile(hFind, &data));
            FindClose(hFind);
        }
    }
    
    int main(int argc, char** argv){
    
            string dir = "c:\\*.*";
            cout<<"\nListing directories or files..\n\n";
            listdirandfiles(dir);
    
            cout<<"\nPress ANY key to close.\n\n";
            cin.ignore(); cin.get();
    return 0;
    }
    

    Visual Studio 2013 代码:

    // visual studio 2013
    // listdirConsoleApplication15.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
    {
        wchar_t* wString = new wchar_t[4096];
        MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
        return wString;
    }
    
    void listdirandfiles(char *wstr){
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind;
        hFind = FindFirstFile(convertCharArrayToLPCWSTR(wstr), &FindFileData);
    
        do{
            _tprintf(TEXT("%s\n"), FindFileData.cFileName);
        } while (FindNextFile(hFind, &FindFileData));
    
        FindClose(hFind);
    
    }
    
    int main( )
    {
    
        char *wstr = "c:\\*.*";
    
        cout << "\nListing directories or files..\n\n";
    
        listdirandfiles(wstr);
    
        cout << "\nPress ANY key to close.\n\n";
        cin.ignore(); cin.get();
    
        return 0;
    }
    

    【讨论】:

    • WRT "这需要使用宽字符[,]" Windows 通常提供两个函数,一个带有 'W' 后缀的宽字符和一个带有 'A' 后缀的好 ol' 8位 ANSI。默认情况下,给定函数将被定义为指向“W”版本。例如。 FindFirstFile 定义为 FindFirstFileWFindFirstFileA 可以直接调用,也可以在某个地方有一个编译器选项来全局从“W”重定向到“A”。不过,如果我能记住这个选项,那就太危险了。
    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2013-04-19
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多