C# d'Obtenir une liste de fichier complet à l'aide de ftpRequest est lent
Je veux obtenir le nom de fichier, la taille du fichier et l'heure de dernière modification de chaque fichier sur un serveur FTP, puis remplir une listView avec elle.
Il marchait très bien jusqu'à ce que je suis passé à l'hôte FTP, et maintenant il est vraiment lent, en dépit de la nouvelle l'hôte d'être tout aussi vite dans la vraie clients FTP.
Aucune raison apparente pour expliquer pourquoi?
Aussi, est-il vraiment nécessaire d'envoyer les informations de connexion à chaque fois?
Je suis en utilisant la première méthode pour obtenir un tableau de chaîne, puis itérer dessus et utiliser la seconde sur chaque élément pour obtenir la taille du fichier:
public static string[] GetFileList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://mysite.se/"));
request.UseBinary = true;
request.Credentials = new NetworkCredential(settings.Username, settings.Password);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.UseBinary = true;
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
//to remove the trailing '\n'
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
downloadFiles = null;
return downloadFiles;
}
}
public static int GetFileSize(string file)
{
//MessageBox.Show("getting filesize...");
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://mysite.se/" + file));
request.UseBinary = true;
request.Credentials = new NetworkCredential(settings.Username, settings.Password);
request.Method = WebRequestMethods.Ftp.GetFileSize;
int dataLength = (int)request.GetResponse().ContentLength;
return dataLength;
}
catch (Exception ex)
{
//System.Windows.Forms.MessageBox.Show(ex.Message);
return 1337;
}
}
OriginalL'auteur pastapockets | 2010-02-20
Vous devez vous connecter pour publier un commentaire.
Le problème est que chaque GetFileSize appel a vous reconnecter au serveur et d'émettre une demande pour la taille du fichier. Si vous pouvez mettre des choses en place pour l'utilisation d'un unique, de connexion persistante ensuite, vous économiserez du temps de connexion, mais il va encore passer beaucoup de temps à l'envoi d'une demande pour chaque fichier et en attente d'une réponse.
(Edit: c'est peut-être déjà le cas. MSDN dit: Plusieurs FtpWebRequests la réutilisation des connexions existantes, si possible.)
Si vous utilisez ListDirectoryDetails plutôt que ListDirectory, le serveur va probablement envoyer plus d'informations (taille du fichier, les permissions, etc) le long de chaque nom de fichier. Ce ne serait pas en prendre plus de temps pour faire ListDirectory, et vous pourriez tirer le nom et la taille de chaque ligne et de stocker les tailles pour plus tard.
Cependant, les différents serveurs peuvent envoyer les informations dans des formats différents, et certains peuvent ne pas envoyer la taille de l'info à tous, si cela peut ne pas aider si vous avez besoin de votre programme fiable utiliser un serveur FTP.
OriginalL'auteur andrewffff
Pas correct ou même la bonne réponse:
Voici une PowerShell exemple de test qui montrent comment cela fonctionne:
Il utilise une HP serveur public et montre comment obtenir la taille du fichier.
ListDirectoryDetails reçoit le dossier informaion.
La plus grosse erreur ci-dessus est que le mode est la valeur Binaire. Toutes les listes de répertoires et de fichiers d'info doit utiliser le mode texte.
OriginalL'auteur JRV
Ici est une méthode éprouvée et rapide façon d'obtenir une liste de répertoire. Il peut être testé en tant que-est avec PowerShell.
OriginalL'auteur JRV