c++ - 为什么 CreateFile 无法通过网络共享打开文件?

标签 c++ winapi networking file-io

我编写了一个小程序,它经常打开小型用户文本文件,到目前为止还没有遇到任何读/写访问问题或任何类型的冲突。这些文件是在另一个我无法控制的软件中选择的,并作为字符串传递给我。

尝试从映射的网络驱动器打开文件时,出现“系统找不到指定的路径”错误 (GetLastError() = 3)。

调用如下所示,*iNCfileName = "z:\\Validation\\Sample Files\\1_1-4 120MM.CC",其中 Z: 是我们域上的映射文件夹。

iNCfile = CreateFile( iNCfileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if ( iNCfile == INVALID_HANDLE_VALUE ) 
{
    string msg; // lots of better ways to get this printed ... but ...
    dw = GetLastError();
    msg = iNCfileName;
    msg += ": ";
    msg += _com_error(dw).ErrorMessage();
    print_error(dw , (char*)msg.c_str() );
    return 102;
}

如果我将文件复制到本地硬盘驱动器,该文件将从我的程序中打开。它还可以从映射驱动器在记事本中打开。

这可能是“Z:\whatever.txt”映射表示和真实文件名 (\mydomain\Validation\S....??) 之间的问题吗?

如果是这样,我如何以编程方式从一种方式转换为另一种方式(假设我提前不知道域名/共享名)?

如果有什么区别的话,我使用 VS2010 并且应用程序在 Win XP 计算机上执行。

相关:my follow up question

最佳答案

我以前也遇到过这种情况。当使用像 \\DOMAIN\PATH\FILE.TXT 这样的路径时,我必须首先调用 WNetAddConnection2()

这是我的代码(当然你可以排除 NULL 成员):

NETRESOURCE nr = {0}; //new structure for network resource
nr.dwType = RESOURCETYPE_ANY; //generic resource (any type allowed)
nr.lpLocalName = NULL; //does not use a device
nr.lpRemoteName = "\\\\DOMAIN\\PATH\\FOLDER"; //For me, this pointed to an account's documents folder, and from there I could use a subfolder
nr.lpProvider = NULL; //no provider

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

不要忘记 header 和库。

关于c++ - 为什么 CreateFile 无法通过网络共享打开文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587756/

相关文章:

jakarta-ee - Java EE 和传出 TCP 连接

c - 无法使用 Winapi 在 C 下更改窗口大小和缓冲区

c# - 通过句柄或 pid 获取窗口的子窗口

java - WAN 上的 Android P2P 连接

c++ - 需要对 "High definition time-stamps"(win32、direct3d、性能计数器)进行一些说明

c++ - 测试二维变换矩阵是否正交

c++ - 使用C++从URL读取文件而不是使用点云库读取本地文件

android - 在 OpenGL ES 2 中绘制文本的正确方法

c++ - 如何在头文件库中定义(非方法)函数

c++ - 如何在 silverlight 应用程序中引用 C++/CLI 项目