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

时间:2012-03-06 16:26:25

标签: 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

2 个答案:

答案 0 :(得分:2)

我之前遇到过这个。使用\\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

不要忘记标题和库。

答案 1 :(得分:-1)

我刚才有同样的问题;尝试使用映射驱动器(CreateFileW)下的API Z:\folder创建文件无效; howerver,在研究了这个主题后,我尝试使用真实路径创建文件(\\Shared_computer_name\folder\)立即成功运行。

现在我必须使用一个函数来检索映射驱动器的真实名称,以便在必要时使用它...只需找到WNetGetUniversalName,就必须使其工作。