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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die erste Sache, sollten Sie versuchen zu drehen passiv-Modus ab, da diese automatisch blockiert, durch die meisten firewalls, aber ist die Standard-Betriebsart für ftpWebRequest.
Nur unterhalb dieser Zeile:
und diese: