为什么boost :: filesystem is_directory在作为Windows服务运行时会返回不同的结果?

时间:2011-10-11 19:27:21

标签: windows boost windows-services boost-filesystem

我有一些代码可以遍历目录中的文件并对非目录文件执行有用的操作,如下所示:

namespace bfs = boost::filesystem;
for (bfs::directory_iterator iterDir(m_inPath); 
     bContinue && iterDir!=bfs::directory_iterator(); iterDir++)
{
    std::string filename = iterDir->path().filename().string();
    boost::to_lower(filename);

    if (!bfs::is_directory(*iterDir) && Condition2(filename)) {
        std::ifstream ifFile(iterDir->path().string().c_str());
        DoUsefulThings(iterDir());
    }
}

这在我的单元测试中运行良好,但是当我将整个程序作为服务运行时,我的测试目录(似乎错误地)通过了!bfs::is_directory检查和DoUsefulThings的{​​{1}检查失败,错误为13。

我尝试将ifstream.good()更改为!bfs::is_directory(认为可能存在系统条件导致其为其他内容),但我得到了相同的结果。 bfs::is_regular_file条件在我的单元测试中的目录上失败,但在作为服务运行时通过。

我还在if语句周围添加了一个try / catch,看它是否抛出异常并验证它不是(可能无论如何都可以使用它,但是没有帮助)。

我认为问题可能与服务的权限级别有关,因此我更改了服务的属性以登录为我用于登录该系统的帐户。结果相同。我还试着在PerformanceMonitor上试图找到一些线索,但我还没有收集太多信息。

有人可以说明为什么会这样吗? Errno = 13 ==“许可被拒绝”,对吧?在调用is_directory之前是否需要执行额外的检查?

我使用的是Windows XP,Visual Studio 2008 / C ++,Boost库的1.44版和文件系统的第3版。

ETA:我添加了以下内容来手动测试目录(斜杠标记的方向没有区别),并且is_regular_file按预期运行:

is_regular_file

我有日志语句打印出* iterDir和iterDir-> path(),它们都匹配我手动放入的那个。这会排除权限问题吗?将继续测试,因为这个结果对我来说真的没有意义。

2 个答案:

答案 0 :(得分:2)

@Ennael:

不要忘记您在尝试访问的文件夹的所有父文件夹/设备节点上都需要遍历权限。我认为罗曼的建议首先是为了消除疑虑(当然这是非理性的:Errno=13 == "permission denied")。

你可以从那里开始使用像

这样的工具
  • CACLS.EXE

执行命令行ACL列表/编辑

  • AccessEnum v1.32检测文件系统树中权限的任何更改(有一个很好的选项,仅在权限受到更多限制或更宽松时发出警告)

答案 1 :(得分:0)

呸。这是我的“Condition2”中的一个错误。谢谢你的帮助。