6

初めてのポスター、長年の読者。私は神経質になっている本当に厄介な問題を抱えています。プログラムをセットアップしたので、FTP サーバーで新しいファイルをリッスンし、新しいファイルがあればダウンロードします。そこから、ファイル内の情報の一部などに取り組みます。私の問題は、シーケンスを 2 回目に実行したときに発生します。つまり、最初にダウンロードしたファイルではすべて問題ありませんが、新しいファイルが検出されてプログラムがダウンロードを試みるとすぐに、プログラムがハングします。

 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);
        }
    }

ハングする行は次のとおりです。 using (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())

ここで私のメソッドが静的である理由は、テストするために別のプロジェクトで実行しているだけだからです..ここでの私の質問は、2番目のファイルでしか死なないのはなぜですか? 私は何時間も盲目的に自分自身を見つめてきました!

4

2 に答える 2

0

私は C# の専門家ではありませんが、次のコードを使用して ftp からファイルをダウンロードします。

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");
                }
            }
        }
    }

それがあなたのために働くかどうか教えてください:)

于 2011-06-01T14:33:38.947 に答える