获取.exe目录中列出的所有文件,但不知道位置

用户名

我想我的问题是-如何将exe位置的目录作为LPCWSTR获得,以便可以将其输入到代码中

#include <iostream>
#include <Windows.h>
int main(int argc, char **argv)
{
WIN32_FIND_DATA a;
HANDLE swap = FindFirstFile(/*(LPCWSTR)__exe_directory__*/,&a);
if (swap!=INVALID_HANDLE_VALUE)
{
    do
    {
        char *sptn = new char [lstrlen(a.cFileName)+1];
        for (int c=0;c<lstrlen(a.cFileName);c++)
        {
            sptn[c]=char(a.cFileName[c]);
        }
        sptn[lstrlen(a.cFileName)]='\0';
        std::cout<<sptn<<std::endl;
    }
    while (FindNextFile(swap,&a));
}
else std::cout<<"undetected file\n";
FindClose(swap);
system("pause");
}

并且它将返回目录中列出的文件,而不会发生错误。我知道,对于给定目录,我的代码已经可以工作了,我已经对其进行了测试。

C64先生

关键是使用GetModuleFileName()nullptr作为模块句柄传递,以引用当前的进程EXE),然后调用PathRemoveFileSpec()(或PathCchRemoveFileSpec(),如果您不关心Windows 8之前的Windows版本)从路径中剥离文件规范。

如要使用,PathRemoveFileSpec()您必须链接到Shlwapi.lib,如MSDN文档中所述

请参阅以下可编译代码作为示例:

#include <iostream>     // For console output
#include <exception>    // For std::exception
#include <stdexcept>    // For std::runtime_error
#include <string>       // For std::wstring
#include <Windows.h>    // For Win32 SDK
#include <Shlwapi.h>    // For PathRemoveFileSpec()

#pragma comment(lib, "Shlwapi.lib")

// Represents an error in a call to a Win32 API.
class win32_error : public std::runtime_error 
{
public:
    win32_error(const char * msg, DWORD error) 
        : std::runtime_error(msg)
        , _error(error)
    { }

    DWORD error() const 
    {
        return _error;
    }

private:
    DWORD _error;
};

// Returns the path without the filename for current process EXE.
std::wstring GetPathOfExe() 
{
    // Get filename with full path for current process EXE
    wchar_t filename[MAX_PATH];
    DWORD result = ::GetModuleFileName(
        nullptr,    // retrieve path of current process .EXE
        filename,
        _countof(filename)
    );
    if (result == 0) 
    {
        // Error
        const DWORD error = ::GetLastError();
        throw win32_error("Error in getting module filename.", 
                          error);
    }

    // Remove the file spec from the full path
    ::PathRemoveFileSpec(filename);

    return filename;
}

int main() 
{
    try 
    {
        std::wcout << "Path for current EXE:\n"
                   << GetPathOfExe() 
                   << std::endl;
    } 
    catch (const win32_error & e) 
    {
        std::cerr << "\n*** ERROR: " << e.what()
                  << " (error code: " << e.error() << ")" 
                  << std::endl;
    } 
    catch (const std::exception& e) 
    {
        std::cerr << "\n*** ERROR: " << e.what() << std::endl;
    }
}

在控制台中:

C:\Temp\CppTests>cl /EHsc /W4 /nologo /DUNICODE /D_UNICODE get_exe_path.cpp
get_exe_path.cpp

C:\Temp\CppTests>get_exe_path.exe
Path for current EXE:
C:\Temp\CppTests

PS
在您的代码中,您似乎引用的Unicode版本FindFirtFile()(即FindFirstFileW(),因为在注释中期望​​使用LPCWSTR,即const wchar_t*),但是随后在以下代码中使用ANSI / MBCS字符串(即char*)。

我建议您始终在现代Windows C ++代码中使用Unicode UTF-16wchar_t*字符串:更好地进行国际化,并且现代Win32 API仅随附Unicode版本。

还要注意,由于使用的是C ++,最好使用健壮且方便的字符串类(例如,std::wstring对于使用Microsoft Visual C ++的Unicode UTF-16字符串),而不是使用类似C的原始字符指针。在API接口上使用原始指针(因为Win32 API具有C接口),然后安全地转换为std::wstring

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Flutter从集合中获取文档,但不知道其ID但知道文件名

来自分类Dev

在不知道所有属性的情况下从HTML标记中获取文本

来自分类Dev

需要从不知道ID的数据库中获取所有记录

来自分类Dev

c ++子获取当前目录中的所有exe文件

来自分类Dev

c ++子获取当前目录中的所有exe文件

来自分类Dev

从不知道扩展名的数组中删除获取名称的文件

来自分类Dev

从不知道扩展名的数组中删除获取名称的文件

来自分类Dev

我不知道如何使用AngularJS在JSON文件中获取子数据

来自分类Dev

我不知道如何使用Range从Excel文件中获取行

来自分类Dev

如果我不知道该行的值,如何获取和更改文件中的行的值?

来自分类Dev

我不知道如何从具有其他列条件的列中获取值

来自分类Dev

我已经设置了Web服务,但不知道如何在MVC 5 C#中从中获取数据

来自分类Dev

获取目录json中的所有文件

来自分类Dev

PHP获取所有文件,但不在子目录中

来自分类Dev

如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

来自分类Dev

使用id获取继承的类,但不知道类的类型

来自分类Dev

SPARQL / DBPedia:通过属性获取实体,但不知道实体页面URI

来自分类Dev

获取InvalidDataAccessApiUsageException和PersistentObjectException,但不知道如何解决它

来自分类Dev

在不知道扩展名的情况下获取文件扩展名,没有模式

来自分类Dev

尝试通过while循环获取所有数据,但是已经获取了第一个数据,不知道如何更改我的代码。(Php)

来自分类Dev

尝试通过while循环获取所有数据,但是已经获取了第一个数据,不知道如何更改我的代码。(Php)

来自分类Dev

获取除隐藏目录中的文件以外的所有文件?

来自分类Dev

从目录和所有子目录获取所有文件,但不包含一个子目录

来自分类Dev

如何拆分字符串以获取字符串中的最后一个单词或两个单词,但不知道字符数或结尾词数?

来自分类Dev

R:获取文件列表但不获取目录

来自分类Dev

R:获取文件列表但不获取目录

来自分类Dev

插件开发和Xtext:扩展ViewPart,并且不知道如何获取活动文件的AST

来自分类Dev

列出/获取 Outlook 中的所有 SentOnBehalfNames

来自分类Dev

如何获取目录中的所有文件名?

Related 相关文章

  1. 1

    Flutter从集合中获取文档,但不知道其ID但知道文件名

  2. 2

    在不知道所有属性的情况下从HTML标记中获取文本

  3. 3

    需要从不知道ID的数据库中获取所有记录

  4. 4

    c ++子获取当前目录中的所有exe文件

  5. 5

    c ++子获取当前目录中的所有exe文件

  6. 6

    从不知道扩展名的数组中删除获取名称的文件

  7. 7

    从不知道扩展名的数组中删除获取名称的文件

  8. 8

    我不知道如何使用AngularJS在JSON文件中获取子数据

  9. 9

    我不知道如何使用Range从Excel文件中获取行

  10. 10

    如果我不知道该行的值,如何获取和更改文件中的行的值?

  11. 11

    我不知道如何从具有其他列条件的列中获取值

  12. 12

    我已经设置了Web服务,但不知道如何在MVC 5 C#中从中获取数据

  13. 13

    获取目录json中的所有文件

  14. 14

    PHP获取所有文件,但不在子目录中

  15. 15

    如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

  16. 16

    使用id获取继承的类,但不知道类的类型

  17. 17

    SPARQL / DBPedia:通过属性获取实体,但不知道实体页面URI

  18. 18

    获取InvalidDataAccessApiUsageException和PersistentObjectException,但不知道如何解决它

  19. 19

    在不知道扩展名的情况下获取文件扩展名,没有模式

  20. 20

    尝试通过while循环获取所有数据,但是已经获取了第一个数据,不知道如何更改我的代码。(Php)

  21. 21

    尝试通过while循环获取所有数据,但是已经获取了第一个数据,不知道如何更改我的代码。(Php)

  22. 22

    获取除隐藏目录中的文件以外的所有文件?

  23. 23

    从目录和所有子目录获取所有文件,但不包含一个子目录

  24. 24

    如何拆分字符串以获取字符串中的最后一个单词或两个单词,但不知道字符数或结尾词数?

  25. 25

    R:获取文件列表但不获取目录

  26. 26

    R:获取文件列表但不获取目录

  27. 27

    插件开发和Xtext:扩展ViewPart,并且不知道如何获取活动文件的AST

  28. 28

    列出/获取 Outlook 中的所有 SentOnBehalfNames

  29. 29

    如何获取目录中的所有文件名?

热门标签

归档