gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:28:10 25 4
gpt4 key购买 nike

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

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 ifstream.good() 检查失败,errno 为 13。

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

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

我认为问题可能与服务的权限级别有关,因此我更改了服务的属性以使用我用于登录该系统的同一帐户登录。同样的结果。我也尝试使用 PerformanceMonitor 来尝试从中获得一些线索,但我还没有从中收集到太多信息。

有人可以提出为什么会发生这种情况吗? Errno=13 == “permission denied”,对吧?在调用 is_directory 之前我需要执行额外的检查吗?

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

预计到达时间:我添加了以下内容以手动测试目录(斜杠的方向没有影响),并且 is_regular_file 的行为符合预期:

std::string strDir = "D:/Dir1/Dir2/Dir3/Dir4/Dir5\\Dir6";
if (bfs::is_regular_file(strDir))
LOG("It's a regular file"); //This does not get executed
else
LOG("Not a regular file"); //This does

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

最佳答案

@恩内尔:

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

你可以从那里开始使用像这样的工具

  • cacls.exe

执行命令行 ACL 列表/编辑

  • AccessEnum v1.32检测文件系统树中权限的任何变化(有一个漂亮的选项,仅在权限变得更受限制或更宽松时发出警告)

关于windows - 为什么 boost::filesystem is_directory 在作为 Windows 服务运行时返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7731403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com