3

我想从 ftp 服务器下载图像,但是当我转到“FtpWebResponse”时,我只是得到了这个异常作为标题。

下面是我的下载功能

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(myStringWebSource);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(this.FtpUserID, this.FtpPassword);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream);
System.IO.StreamWriter writer = new System.IO.StreamWriter(SaveFile);
writer.Write(reader.ReadToEnd());

writer.Close();
reader.Close();
response.Close();

我用谷歌搜索了这个异常几天,但我仍然无法弄清楚为什么会出错。如果没有足够的信息,请告诉我。

4

2 回答 2

0

当您要下载的文件正在被另一个进程使用时,您将收到此错误。

于 2013-04-03T22:18:48.490 回答
0

为了解决这个问题,需要强制 System.Net.FtpWebRequest 命令恢复到它在 .Net Framework 2.0/3.5 中的旧行为,并在发出实际命令之前发出额外的 CWD 命令.

为此,需要在调用 System.Net.FtpWebRequest 类的任何实例之前放置以下代码。下面的代码只需要调用一次,因为它改变了整个应用程序域的设置。

private static void SetMethodRequiresCWD()
{
    Type requestType = typeof(FtpWebRequest);
    FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
    Type methodInfoType = methodInfoField.FieldType;


    FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
    Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);

    FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);

    int MustChangeWorkingDirectoryToPath = 0x100;
    foreach (object knownMethod in knownMethodsArray)
    {
        int flags = (int)flagsField.GetValue(knownMethod);
        flags |= MustChangeWorkingDirectoryToPath;
        flagsField.SetValue(knownMethod, flags);
    }
}

http://support.microsoft.com/kb/2134299

于 2013-11-06T21:58:05.240 回答