Wie kann ich das speichern von Dateien von ftp?

Ich habe eine methode, die Kopie der Ordner-Struktur vom ftp auf den lokalen Ordner und kopieren Sie dann alle Dateien, die darin besteht, in Ihnen:

public void CreateDirectories()
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Url);
    request.Credentials = new NetworkCredential(Login, Pass);
    request.Method = WebRequestMethods.Ftp.ListDirectory;

    string soursePath = @"L:\Test";

    StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream());

    string directoryName = streamReader.ReadLine();

    while (directoryName != null)
    {
        //Create directories structure
        if (directoryName.StartsWith("I") && !directoryName.Contains("p"))
        {
            string newPath = System.IO.Path.Combine(soursePath, directoryName);
            if (!System.IO.Directory.Exists(newPath))
            {
                System.IO.Directory.CreateDirectory(newPath);

                //get file list and invoke DownLoad(string directoryName, string fileName)
                FtpWebRequest fileRequest = (FtpWebRequest)WebRequest.Create(Url + directoryName + "/");
                fileRequest.Credentials = new NetworkCredential(Login, Pass);
                fileRequest.Method = WebRequestMethods.Ftp.ListDirectory;

                StreamReader fileStreamReader = new StreamReader(fileRequest.GetResponse().GetResponseStream());
                string fileName = fileStreamReader.ReadLine();
                while (fileName != null)
                {
                    DownLoad(directoryName, fileName);
                    fileName = streamReader.ReadLine();
                }

            }
        }

        directoryName = streamReader.ReadLine();
    }

    request = null;
    streamReader = null;
}

und die methode, die Kopie der aktuellen Datei:

public void DownLoad(string directoryName, string fileName)
{
    string localPath = @"L:\Test\" + directoryName;

    FtpWebRequest requestFileDownload = (FtpWebRequest)WebRequest.Create("ftp://ftp.equip.me/prod/" + directoryName + "/" + fileName);
    requestFileDownload.Credentials = new NetworkCredential(Login, Pass);
    requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile;

    FtpWebResponse responseFileDownload = (FtpWebResponse)requestFileDownload.GetResponse();

    Stream responseStream = responseFileDownload.GetResponseStream();
    FileStream writeStream = new FileStream(localPath + "\\" + fileName, FileMode.Create);

    int Length = 2048;
    Byte[] buffer = new Byte[Length];
    int bytesRead = responseStream.Read(buffer, 0, Length);

    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = responseStream.Read(buffer, 0, Length);
    }

    responseStream.Close();
    writeStream.Close();

    requestFileDownload = null;
    responseFileDownload = null;
}

Aber in der Schlange Stream responseStream = responseFileDownload.GetResponseStream(); Stoppt es fast 40 Sekunden, und dann werfen eine Ausnahme von timeout, und nicht eine Datei noch nicht gespeichert wurde (die Datei ist klein - 50 kb)

  • ist Ihre firewall öffnen, die für FTP-Anfragen?
  • speichern von Ordner-Struktur arbeiten, das problem ist also nicht verbunden mit firewall
  • Ist es andernfalls zu einer bestimmten Datei? In einem bestimmten Verzeichnis? Vielleicht ist der FTP-server die Begrenzung der Anzahl der aktiven verbindungen (Sie haben bereits zwei verbindungen wenn Sie den download starten)
  • Ich könnte mich irren, aber ich glaube, die FtpWebRequest verwenden die passive Methode, die standardmäßig für die übertragung von Dateien (die nicht gelten listing/navigieren in den Verzeichnissen). Im passiv-Modus eine zweite Verbindung wird aufgebaut, auf einem zufälligen port, auf den die Daten übertragen werden. Wie rene schon sagte, das ist wahrscheinlich ein firewall-problem.
Schreibe einen Kommentar