【问题标题】:How to read file remotely?如何远程读取文件?
【发布时间】:2020-07-06 04:37:51
【问题描述】:

我有这样一种按路径读取文件的方法

void test_read_file(std::string const & fileName)
{
    std::ifstream file(fileName);
    if (!file.is_open())
    {
        std::cout << "LoadFromFile FAILED to load: " << fileName << std::endl;   <--- this line
    }

    ...
}

如果我作为路径 C:\\... 传递,这种方法效果很好,但如果我传递类似 \\\\my_remote_drive\\my_user\\.... 的东西,它就不起作用,我来到我上面标记的行。

好像是权限不足之类的……

我做错了什么?

【问题讨论】:

  • AFAIK fstream 使用本地文件。因此,也许可以尝试使用 sshfs 或 NFS 在本地安装远程磁盘(不确定这在 Windows 上是否可用)。或者也许在诸如 FTP 之类的网络协议之上使用其他东西。
  • 也许最简单的方法是将文件下载到临时文件夹然后打开它。
  • std::(i|o)fstream() 适用于由有效路径字符串表示的任何文件。它委托底层操作系统实际打开文件。 Windows API 可以打开 UNC 路径,前提是提供到 UNC 共享的有效网络连接。正如 OP 所推测的那样,我必须假设问题与权限有关。直接使用CreateFile() 进行验证。如果CreateFile() 失败,请使用GetLastError() 找出原因
  • @RemyLebeau 我使用 CLI 实现,我发现如果我尝试从 c# 代码读取这个文件是可以的,但是如果我尝试在 c++ 端做同样的事情,它会失败......所以,我认为这不应该是权限问题
  • 您需要先为\\\\my_remote_drive\\IPC$ 调用NetUseAdd 并设置用户名/密码

标签: windows visual-studio winapi visual-c++


【解决方案1】:

您需要先连接到网络资源,使用WNetAddConnection2A(类似的API有NetUseAddNPAddConnection等),此功能还可以将本地设备重定向到网络资源。

lpRemoteName:

共享示例如下:\192.168.1.1\share

NETRESOURCE nr = {0};
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = NULL; //does not assign a drive.
nr.lpRemoteName = "\\192.168.1.1\\share";

DWORD ret = WNetAddConnection2 (&nr, NULL, NULL, CONNECT_TEMPORARY);

要将驱动器分配给共享: 你可以参考Assigning a Drive to a Share

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2010-09-30
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多