如何检查连接网络驱动器?

4

我有一个应用程序会使用WNetAddConnection2()在我的网络驱动器上不断地创建/写入文件。

    NETRESOURCE nr = {0,};
    nr.dwType = RESOURCETYPE_ANY; 
    nr.lpLocalName = nullptr; 
    nr.lpRemoteName = L"\\\\MyNetworkDrive\\MyFolder\\"; 
    nr.lpProvider = nullptr; 

    DWORD ret = WNetAddConnection2 (&nr, L"MyPW", L"MyID", CONNECT_UPDATE_PROFILE); //add connection

    // A few seconds needed to invoke StartWritingFiles();    

    StartWritingFiles();
< p >但是WNetAddConnection2需要执行这样的繁重工作才能返回结果,这使得应用程序看起来像冻结了一样。< / p > < p >所以我想,当与MyNetworkDrive的连接保持活动状态时,我应该< strong>避免调用它< / strong>。< / p > < p >我应该寻找哪个API来解决这个问题?< / p > < p >提前感谢。< / p >

1
将网络操作放在线程之外。 - Martin James
@MartinJames 那难道没有方法来判断连接是否还活着吗? - Dean Seo
首先,根据 "Martin James" 的建议,您应该使用单独的线程。其次,您尝试过 GetFileAttributes 吗?如果网络连接不活动或网络驱动器不可用,GetLastError() 将返回 ERROR_BAD_NETPATH。 - bkausbk
2
任何对网络驱动器的访问都有可能导致阻塞(长时间),因此如果可能的话,最好始终在非 UI 线程上执行。 - Jonathan Potter
谢谢。我会尝试将特定进程分离成线程! - Dean Seo
1个回答

2

上面的评论是正确的。网络操作不应该在UI线程中进行。但是,如果您不想使用线程,我相信您想枚举所有打开的连接,以查看所需资源是否已连接。请尝试像这样使用WNetOpenEnum:

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <Winnetwk.h>
#include <stdio.h>

#pragma comment(lib,"Mpr.lib")

VOID main(){

    HANDLE hEnum = (HANDLE)0;

    DWORD dwError = WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,0,NULL,&hEnum);

    if (dwError == NO_ERROR){

        DWORD dwCount = -1;

        CHAR szBuff[1000];

        ZeroMemory(szBuff,sizeof(szBuff));

        DWORD dwSize = sizeof(szBuff);

        dwError = WNetEnumResource(hEnum,&dwCount,szBuff,&dwSize);

        if (dwError == NO_ERROR){

            NETRESOURCE *pnr = (NETRESOURCE*)szBuff;

            for (DWORD d = 0; d < dwCount; d++){

                if (pnr[d].lpRemoteName){

                    printf("%s\n",pnr[d].lpRemoteName);

                }

            }

        }

        WNetCloseEnum(hEnum);

    }else{

        printf("Failed: %u\n",dwError);

    }

}

这有点hackish,因为我假设所有连接都适合1000字节。您可以在此处阅读有关函数WNetOpenEnum及其相关信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385478%28v=vs.85%29.aspx

谢谢你的回答。现在我有了另一个选择,除了关闭线程,这仍然不是一个坏主意。 - Dean Seo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接