我编写了一个小程序,它经常打开小型用户文本文件,到目前为止还没有遇到任何读/写访问问题或任何类型的冲突。这些文件是在另一个我无法控制的软件中选择的,并作为字符串传递给我。
尝试从映射的网络驱动器打开文件时,出现“系统找不到指定的路径”错误 (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 计算机上执行。
最佳答案
我以前也遇到过这种情况。当使用像 \\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/