Boost Filesystem存在访问冲突

时间:2018-02-13 11:41:10

标签: c++ boost mfc

我遇到boost::filesystem::exists(pathName)问题。

当文件夹不存在时,该方法按预期返回false。 如果文件夹存在,则会在Boost文件的make_permissions(const path& p, DWORD attr)方法operations.cpp中引发异常。

这是该文件的代码

if (equal_string_ordinal_ic(ext.c_str(), L".exe")
  || equal_string_ordinal_ic(ext.c_str(), L".com")
  || equal_string_ordinal_ic(ext.c_str(), L".bat")
  || equal_string_ordinal_ic(ext.c_str(), L".cmd"))
  prms |= fs::owner_exe | fs::group_exe | fs::others_exe;
return prms;

消息是:

Exception thrown at 0x00000000 in LineSync.exe: 0xC0000005: Access violation executing location 0x00000000.

这是在if声明中引发的。 我在Windows 10下的MFC应用程序中使用此方法。在Windows 7上,问题不存在。

如果我在Windows 10上创建示例Windows控制台应用程序,则问题也没有发生。

这是代码,它不适用于MFC项目,但适用于Windows 10控制台应用程序。

boost::filesystem::path pathDir(L"logs");
if (!boost::filesystem::exists(pathDir)) {
    boost::filesystem::create_directory(pathDir);
}

更改为boost::filesystem::is_directory(pathDir)也会导致MFC项目上的例外

MFC和Windows 10有问题吗? 或者有更好的方法来检查特定目录是否存在?

编辑2:

这是一个应该在Windows上使用Boost 1.66

导致错误的示例
bool dummy = boost::filesystem::exists("logs");

class Demo {
public:
    ~Demo() {
        std::cout << boost::filesystem::path("logs").string() << std::endl;
    }
};

Demo d;

int main()
{
    Demo();
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

  

有没有更好的方法来检查特定目录是否存在?

您也可以将PathFileExists与MFC一起使用。

正如MSDN所说:

  

确定文件系统对象(如文件或文件夹)的路径是否有效。

我已多次使用此功能,没有任何问题。如文章中所示,您必须在 shell轻量级API 中进行链接才能使其正常工作。