Descargue un archivo individual del servidor FTP en trozos en varios hilos usando C # -- # campo con .net campo con multithreading campo con ftp campo con ftpwebrequest camp Relacionados El problema

Download single file from FTP server in chunks in multiple threads using C#


1
vote

problema

Español

Solo quería descargar un solo archivo del servidor FTP en varios segmentos en varios hilos usando C #.

¿Es posible dar rangos para la descarga de archivos como en HttpWebRequest ?

Original en ingles

I just wanted to download a single file from FTP server in multiple segments in multiple threads using C#.

Is it possible to give ranges for the file download like in HttpWebRequest?

              

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Puede usar FtpWebRequest.ContentOffset para especificar el desplazamiento de inicio.

pero FtpWebRequest.ContentLength no se implementa. Para solucionarlo, debe abortar la descarga, una vez que reciba la cantidad deseada de bytes.

  { "matches_count": 1, "results": [     {         "_entity_type": "SoccerGame",         "_id": "SoccerGame_490555",         "away_score": null,         "away_team": {             "_entity_type": "SoccerTeam",             "_id": "SoccerTeam_86",             "espn_id": 86,             "id": "SoccerTeam_86",             "logo_url": "http://a.espncdn.com/combiner/i?img=/i/teamlogos/soccer/500/86.png&h=500",             "team_name": "Real Madrid"         },         "competition": "Spanish Primera División",         "game_id": "490555",         "home_score": null,         "home_team": {             "_entity_type": "SoccerTeam",             "_id": null,             "team_name": "Leganes"         },         "link": "http://m.espn.go.com/soccer/gamecast?gameId=490555&lang=EN&wjb=",         "start_datetime": {             "countdown": 86970,             "datetime": "2018-02-21T17:45:00+0000",             "timestamp": 1519235100         },         "status": "FUTURE",         "timestamp": 1519235100     } ]} 0  
 

You can use FtpWebRequest.ContentOffset to specify the starting offset.

But FtpWebRequest.ContentLength is not implemented. To workaround that you have to abort the download, once you receive the desired amount of bytes.

const string name = "bigfile.dat"; const int chunks = 3; const string url = "ftp://example.com/remote/path/" + name; NetworkCredential credentials = new NetworkCredential("username", "password");  Console.WriteLine("Starting...");  FtpWebRequest sizeRequest = (FtpWebRequest)WebRequest.Create(url); sizeRequest.Credentials = credentials; sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize; long size = sizeRequest.GetResponse().ContentLength; Console.WriteLine($"File has {size} bytes"); long chunkLength = size / chunks;  List<Task> tasks = new List<Task>();  for (int chunk = 0; chunk < chunks; chunk++) {     int i = chunk;     tasks.Add(Task.Run(() =>         {             FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);             request.Credentials = credentials;             request.Method = WebRequestMethods.Ftp.DownloadFile;             request.ContentOffset = chunkLength * i;             long toread =                 (i < chunks - 1) ? chunkLength : size - request.ContentOffset;             Console.WriteLine(                 $"Downloading chunk {i + 1}/{chunks} with {toread} bytes ...");              using (Stream ftpStream = request.GetResponse().GetResponseStream())             using (Stream fileStream = File.Create(name + "." + i))             {                 byte[] buffer = new byte[10240];                 int read;                 while (((read = (int)Math.Min(buffer.Length, toread)) > 0) &&                        ((read = ftpStream.Read(buffer, 0, read)) > 0))                 {                     fileStream.Write(buffer, 0, read);                     toread -= read;                 }             }             Console.WriteLine($"Downloaded chunk {i + 1}/{chunks}");         })); }  Console.WriteLine("Started all chunks downloads, waiting for them to complete..."); Task.WaitAll(tasks.ToArray());  Console.WriteLine("Done"); Console.ReadKey(); 
 
 
 
 
1
 
vote

primero el descargo de responsabilidad: La multitarea es no una bala más rápida ". Si lo aplica al problema incorrecto, usted termina con un código que es más complejo / propenso a errores, más exigir memoria y en realidad más lento Luego, el enfoque secuencial / sin single sin single. Una tarea alternativa para una operación de funcionamiento prolongada es generalmente obligatoria. Pero la paralelización masiva es solo en circunstancias muy específicas.

Las operaciones de archivo generaly son el disco o la red límite. La multitarea no agregará ninguna velocidad a las operaciones de disco o en red. Y, de hecho, podría causar una desaceleración, como ncq y las características similares deben estar a la altura de sus solicitudes de acceso al azar . Dicho esto, lo que se está diciendo, lo que, a veces, puede ayudar. Algunos servidores Aplique un límite de "por conexión", y así dividir la descarga en varios segmentos con su propia conexión puede ser una velocidad neta por. Pero asegúrate de que este es en realidad el caso aquí. Considere todo menos el punto 1 de la velocidad de velocidad .

ASUMING ftpwebrequest es la clase que usted están usando, se parece a contentlenght y contentffset podría ser los droides que está buscando por. Básicamente, lo usa, similar a la subcadena, cada conexión / sub-petición toma x bytes de y offset.

 

First the disclaimer: Multitasking is not a magical "go faster" bullet. If you apply it to the wrong problem, you end up with code that is more complex/prone to errors, more memory demanding and actually slower then the plain old singletasked/sequential approach. One alternate Task for a long running operation is genereally mandatory. But Massive parallelisation is only in very specific circumtances.

Generaly file operations are Disk or Network bound. Multitasking will not add any speedup to Disk or Network bound operations. And indeed might cause a slowdown, as NCQ and similar features have to straightern out your random access requests. That being said with Netowrking it sometimes can help. Some servers do apply a "per connection" limit, and thus splitting the download into multiple segments with their own connection can be a net speedup by. But be certain this is actually the case here. Consider all but point 1 of the Speed Rant.

Asuming FTPWebRequest is still the class you are using, it looks like ContentLenght and ContentOffset might be the droids you are looking for. You basically use it similar to substring - each connection/sub-request takes X bytes from Y offset.

 
 
       
       

Relacionados problema

0  Error FTP: (553) No se permite el nombre del archivo  ( Ftp error 553 file name not allowed ) 
Estoy intentando un archivo FTP pero recibo el siguiente error: El servidor remoto devolvió un error: (553) No se permite el nombre del archivo. a SYSTEM...

0  Cargar archivo con FTPWEBREQUEST de una aplicación Azure alojada a un sitio FTP externo  ( Uploading file with ftpwebrequest from an azure hosted application to an externa ) 
Actualizar: Descubrí que no es un problema con Azure más bien el otra parte que realmente está haciendo listado en blanco en la entrada conexión. Im...

9  Establezca el número de puerto cuando use ftpwebrequest en C #  ( Set port number when using ftpwebrequest in c sharp ) 
Sigo obteniendo una excepción cuando intento de FTP a mi servidor WIN 2008 del código C # usando VS2008 como depurador. Mi clase de prueba parece esto: p...

0  Ftpwebrequest detrás de NAT (PASV, SSL)  ( Ftpwebrequest behind nat pasv ssl ) 
¿Alguien ha usado con éxito la clase de FTPWEBREQUEQUEST a FTPs a un servidor remoto desde detrás de un NAT? Mi código es el siguiente: Dim URI = "ftp://"...

9  El servidor remoto devolvió un error: 227 ingresando al modo pasivo (500 oops vs_utility_recv_peek: sin datos)  ( The remote server returned an error 227 entering passive mode 500 oops vs util ) 
Estoy teniendo un problema a conectar un servicio de Windows a un sitio FTP. Heredó un servicio de Windows de otro desarrollador. El servicio se conecta a u...

2  Descarga archivos nuevos y modificados de un servidor FTP  ( Download new and modified files from an ftp server ) 
Estoy tratando de obtener una lista de los archivos en un servidor FTP, entonces uno por uno, verifique si ese archivo existe en el sistema local y si se comp...

1  FileZilla Server devuelve el nombre de la carpeta en la respuesta de NLST  ( Filezilla server returns folder name in nlst response ) 
He realizado algún código que se conecta a un servidor FTP. Mi problema es que yo contra algunos servidores obtienen la carpeta y el nombre de archivo, por ...

1  Archivo dañado después de subir al servidor FTP con WebRequest  ( File corrupted after upload to ftp server with webrequest ) 
Aquí hay algún problema con el transporte .CSV File a FTP Server. Antes de transferirlo está bien, pero cuando lo estoy revisando en FTP, parece roto o algo: ...

0  FTPWEBREQUEST EN EL ARCHIVO DE LECTURA Justo después de cargar el error de acceso denegado  ( Ftpwebrequest on reading file just after uploading give access denied error ) 
Estamos usando la clase FTPWEBREQUEST en mi proyecto para cargar archivos PDF. Para cargar el archivo, estamos utilizando el método de escritura obteniendo un...

2  El acceso a la ruta se niega cuando descarga programáticamente un archivo de FTP en C # en Win7 64bit  ( Access to the path is denied when programmatically downloading a file from ftp i ) 
Estoy usando el C # Framework Rebex para descargar archivos de un FTP en Win7 64bit en VS2008. Después de presionar F5 para comenzar la depuración, recibo u...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos