1

File.Move System.IO.IOException:“此时无法与此远程计算机建立更多连接,因为已经有计算机可以接受的连接数”。

我有一个在 SYS 帐户下运行的进程。它正在处理本地 HD 上的文件,并使用模拟将它们移动到域上的远程驱动器。

编辑,添加代码示例:

重复调用下面的方法(Impersonation 是我用于模拟的实用程序类,这与问题无关)。

private void moveFileUsingImpersonation(string srcFilePath, string dstFilePath, string userName, string passWord)
        {
                WindowsImpersonationContext wic = null;
                // move it to destination 
                try
                {
                    wic = Impersonation.Impersonate(userName, passWord);
                    if (wic != null)
                    {
                        File.Move(srcFilePath, dstFilePath);
                    }
                    else
                    {
                        Console.WriteLine("moveFileUsingImpersonation, Failure to impersonate!");
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine("moveFileUsingImpersonation, Exception={0}", ex.ToString());
                }
                finally
                {
                    Impersonation.UndoImpersonate(wic);
                }
            }

编辑,添加代码示例。

当进程在 XP 机器上运行并且远程驱动器在 XP 或 Win7 机器上时,对 File.Move 的调用就可以正常工作并移动所需的文件。但是,当进程在 Win7 上运行并且远程驱动器在 Win7 机器上时,在移动 20 个文件后会引发上述异常。

我还尝试使用 MOVEFILE_REPLACE_EXISTING 和 MOVEFILE_COPY_ALLOWED 和 MOVEFILE_WRITE_THROUGH 标志调用 win32 API MoveFileEx,结果相同 - ERROR_REQ_NOT_ACCEP 71 (0x47)。

似乎通过调用 File.Move 建立的底层连接在 Win7 上没有正确关闭。

有没有办法克服这个问题?

我在这里想念什么?

谢谢,伊兰

4

1 回答 1

3

根据您的代码,您可能正在使用 UNC 路径进行复制。我一直在这样做时遇到问题,并且我了解到最好只映射然后根据需要在代码中断开驱动器的连接。它使我不必处理权限问题以及您所描述的问题。

我们有一个类为我们处理这个问题。我们已经使用它超过 5 年没有任何问题,包括在代码和远程端的 Win7 机器上。Hoefully 它也对你有用。

public static class NetworkDrives
    {
        public static bool  MapDrive(string DriveLetter, string Path, string Username, string Password)
        {

            bool ReturnValue = false;

            if(System.IO.Directory.Exists(DriveLetter + ":\\"))
            {
                DisconnectDrive(DriveLetter);
            }
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }
        public static bool DisconnectDrive(string DriveLetter)
        {
            bool ReturnValue = false;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }

    }
于 2012-03-27T15:50:49.527 回答