首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序在FtpWebResponse上挂起

程序在FtpWebResponse上挂起
EN

Stack Overflow用户
提问于 2011-06-01 21:37:57
回答 2查看 3.2K关注 0票数 6

第一次的海报,长期的读者。我有一个非常烦人的问题,一直让我心烦意乱。我设置了一个程序,这样我就可以在FTP服务器上监听新文件,如果有新文件,我就下载它。从那里我开始处理文件中的一些信息,等等。当我第二次运行我的序列时,我的问题就出现了。也就是说,在我下载的第一个文件中,一切都是完全正常的,但是一旦检测到一个新文件并且我的程序尝试下载它,我的程序就会挂起。

代码语言:javascript
复制
 private static void DownloadFile(string s)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://blabla.com/"+s);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential("xxx" ,"zzz");

            using (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())
            {
                Stream partReader = partResponse.GetResponseStream();

                byte[] buffer = new byte[1024];
                FileInfo fi = new FileInfo(path);
                FileStream memStream = fi.Create();
                while (true)
                {
                    int bytesRead = partReader.Read(buffer, 0, buffer.Length - 1);
                    if (bytesRead == 0)
                        break;

                    memStream.Write(buffer, 0, bytesRead);
                }
                partResponse.Close();
                memStream.Close();
            }
            Console.WriteLine(DateTime.Now + " file downloaded");
            MoveFileToInProgress(s);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

它挂起的代码行是这样的:使用(FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())

这里我的方法是静态的,因为我只是在一个不同的项目中运行它来测试它。我的问题是,为什么它只在第二个文件中消失?我已经盯着自己看了好几个小时了!

EN

回答 2

Stack Overflow用户

发布于 2014-11-12 03:26:37

我也遇到了这个问题...尝试先完成请求,然后将其关闭,然后再尝试检索响应。这对我很有效(实际上在阅读了MartinNielsen的评论后尝试了一下)。这就是我所做的。

代码语言:javascript
复制
        // connect to the ftp site
        FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpUri);
        ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
        ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);

        // setting proxy to null so that it does not go through the proxy
        ftpRequest.Proxy = null;

        // get file information
        StreamReader fileStream = new StreamReader(filePath);
        byte[] fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
        ftpRequest.ContentLength = fileBytes.Length;
        fileStream.Close();

        // open connection to ftp site
        Stream ftpRequestStream = ftpRequest.GetRequestStream();

        // write the file to the stream
        ftpRequestStream.Write(fileBytes, 0, fileBytes.Length);

        // close the stream
        ftpRequestStream.Close();

        // get the response from the server
        FtpWebResponse ftpUploadResponse = (FtpWebResponse)ftpRequest.GetResponse();
        string result = ftpUploadResponse.StatusDescription;

        // close response
        ftpUploadResponse.Close();

        // return response to calling code
        return result;

下面是我在编写这段代码时使用的几个资源(我不会发布超过2个,还有更多)

How to: Upload Files with FTP

Uploading a file -- "The requested URI is invalid for this FTP command"

票数 4
EN

Stack Overflow用户

发布于 2011-06-01 22:33:39

我不是C#方面的专家,但我使用以下代码从我的ftp下载文件:

代码语言:javascript
复制
public void Download(string filename)
    {
        // I try to download five times before crash
        for (int i = 1; i < 5; i++)
        {
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(Global.Path + "/" + filename);
                ftp.Credentials = new NetworkCredential(User, Pass);
                ftp.KeepAlive = false;
                ftp.Method = WebRequestMethods.Ftp.DownloadFile;
                ftp.UseBinary = true;
                ftp.Proxy = null;

                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;

                string LocalDirectory = Application.StartupPath.ToString() + "/downloads/" + filename;
                using (FileStream fs = new FileStream(LocalDirectory, FileMode.Create, FileAccess.Write, FileShare.None))
                using (Stream strm = ftp.GetResponse().GetResponseStream())
                {
                    contentLen = strm.Read(buff, 0, buffLength);
                    while (contentLen != 0)
                    {
                        fs.Write(buff, 0, contentLen);
                        contentLen = strm.Read(buff, 0, buffLength);
                    }
                }

                Process.Start(LocalDirectory);
                break;
            }
            catch (Exception exc)
            {
                if (i == 5)
                {
                    MessageBox.Show("Can't download, try number: " + i + "/5 \n\n Error: " + exc.Message,
                        "Problem downloading the file");
                }
            }
        }
    }

告诉我它是否适用于您:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6202067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档