【问题标题】:Naming memory mapped files命名内存映射文件
【发布时间】:2017-04-05 12:09:06
【问题描述】:

根据文档,在 Local\ 或 Global\ 之后,除了反斜杠之外,任何字符都可以。我决定根据物理文件的文件路径来命名我的 mmf,如下所示:

    std::string GetMapName(std::string FilePath) {
        std::string Ret("Local\\");
        char* pP = (char*)FilePath.c_str();
        for (int i = 0; i < Path.size(); i++) {
            if (pP[i] == '\\') pP[i] = '/';
        }
        Ret.append(FilePath);
        return Ret;
    }

因此,如果文件位于 C:\test\vht1.tst 则它会生成字符串“Local\C:/test/vht1.tst”

我在我的计算机上对此没有任何问题,但该软件最终会在共享主机环境中运行,我真的找不到太多关于命名 MMF 的约定的信息,所以.. 这是个好主意吗?

【问题讨论】:

  • 不允许修改.c_str()返回的字符串内容。
  • 它工作得很好.. 但我猜它不能保证这样做,那么你对字符替换有什么建议?
  • 使用FilePath[i] 而不是pP[i]
  • 我认为您的代码不能在 Unix 主机上运行。在 Unix 上,/ 是一个目录分隔符,但\ 只是一个普通的文件名字符。
  • 好吧!不知道字符串有括号运算符。

标签: c++ memory-mapped-files


【解决方案1】:

命名您的 MMF 映射(内存映射文件)有两个原因:

  • MMF 读写器之间的接口
  • 帮助您调试的标识符

除非您有一个非常大的项目,否则您不太可能发生本地名称冲突。从字面上看,您可以将其命名为任何您喜欢的名称。

包括驱动器号和路径可能不是最佳选择。保持简单:

std::string GetMapName(std::string filePath)
{
  return "Local\\" + Path::GetFileName(filePath);
}

根据文档[1],您不应使用“Session\”前缀。它保留供系统使用。而“Global\”前缀需要 SeCreateGlobalPrivilege。

[1]https://msdn.microsoft.com/en-us/library/aa382954%28v=vs.85%29.aspx

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多