2016-11-28 119 views
-1

我试过在执行net use命令后目录是否存在,但checkMappedDrive()在mapDrive()完成映射驱动器之前正在执行。如何检查驱动器是否已成功映射到C#中的网络使用?

public void mapDrive(String driveChar, String server, String user, String password){ 
    String path = "use "+driveChar+": "+server +" /user:"+user+ " "+password; 
    proc.StartInfo.FileName = "net"; 
    proc.StartInfo.Arguments = path; 
    proc.StartInfo.UseShellExecute = false; 
    proc.Start(); 

    if(checkMappedDrive(driveChar)){ 
     //nice 
    }else{ 
     //error 
    } 

} 

public bool checkMappedDrive(String driveChar){ 

    String drive = Path.GetPathRoot(driveChar.ToUpper()+":\\"); 
    Debug.WriteLine("Checking: " + drive); 
    if (!Directory.Exists(drive)){ 
      proc.Kill(); 
      //bad 
    return false; 
    } 
     //nice 
    return true; 
} 
+0

使用Process.WaitForExit(),以确保您的shell操作完成。然后检查你的Process的ExitCode是否有错误。您可能仍然需要检查您的文件夹已被映射成功后。 –

+0

我想完成这个过程,因为当用户无效时,大约需要10-15秒才能完成该过程,也许是服务器超载或其他问题。 – tomyforever

回答

1

你可以使用Process.WaitforExit

public void mapDrive(String driveChar, String server, String user, String password){ 
    String path = "use "+driveChar+": "+server +" /user:"+user+ " "+password; 
    proc.StartInfo.FileName = "net"; 
    proc.StartInfo.Arguments = path; 
    proc.StartInfo.UseShellExecute = false; 
    proc.Start(); 
    proc.WaitForExit(10000); // wait 10 seconds at a maximum 

    if(checkMappedDrive(driveChar)){ 
     //nice 
    }else{ 
     //error 
    } 

} 
+0

不要忘记使用超时值作为参数:https://msdn.microsoft.com/en-us/library/ty0d8k56.aspx – RvdK

+0

所以,唯一的办法就是等几秒钟吧?把一个无效的用户花费20秒:/ – tomyforever

+0

@tomyforever:该方法不会等待x秒,它会一直等到进程存在,但如果等待时间超过x毫秒(10秒以上),它会继续。所以'Process.WaitForExit'的参数应该是映射驱动器通常需要的两倍。 –

相关问题