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