¿Cómo hacer que este código FtpWebRequest sea más rápido?

Escribí esto para verificar si el nombre de archivo en una columna de tabla existe en el directorio del servidor ftp si existe, luego actualice (usando la consulta de actualización) la columna Isexists con valor 1 de lo contrario, manténgalo como está.

Estoy usando DataTable para leer cada fila (nombre de archivo) y luego hago FtpWebRequest todo el tiempo para verificar si el archivo existe o no.

De esta manera CheckIfFtpFileExists(string fileUri) recibir llamadas para el número de veces es igual al no. de filas en el DataTable.

¿Hay alguna manera de que pueda hacer la autenticación FTP? solo una vez y luego llamar a la función.

Cualquier sugerencia ¿Cómo puedo mejorar mi código para aumentar la velocidad de.

namespace FTP_File_Check
{
    class Program
    {
        static void Main(string[] args)
        {
            string connString = @"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DMSTG;Data Source=.";



   string sql = @"SELECT full_file_name from Intellitrack.S_Sr_att_Delta_Consolidated_28082012 where Isexists=0";

        SqlConnection conn = new SqlConnection(connString);
           conn.Open();
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            da.Fill(dt);


            foreach (DataRow row in dt.Rows)
            {
                foreach (DataColumn col in dt.Columns)
                {


                    SqlConnection sqlConnection1 = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DMSTG;Data Source=.");
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandType = CommandType.Text;

                    if (CheckIfFtpFileExists("ftp://myftpaddressgoeshere.com/0708/" + row[col].ToString()))
                    {
                      // Found File Exists
                        cmd.CommandText = @"UPDATE Intellitrack.S_Sr_att_Delta_Consolidated_28082012 
                                       SET Isexists = 1 
                                         where full_file_name='" + row[col].ToString() + "'";
                        cmd.Connection = sqlConnection1;

                        sqlConnection1.Open();

                       cmd.ExecuteNonQuery();
                        sqlConnection1.Close();

                    }


                }

            }

    }

    public static bool CheckIfFtpFileExists(string fileUri)
    {

            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(fileUri);
            request.Credentials = new NetworkCredential("myuserid", "mypassword");
            request.KeepAlive = true;
            request.ConnectionGroupName = "file";
            request.ServicePoint.ConnectionLimit = 8;
            request.UseBinary = true;
            request.UsePassive = false;

            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;


            try
            {

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            }
            catch (WebException ex)
            {
                FtpWebResponse response = (FtpWebResponse)ex.Response;
                if (FtpStatusCode.NotLoggedIn == response.StatusCode)
                {
                    Console.WriteLine("Failed to connect to ftp server");
                    Console.ReadLine();
                    Environment.Exit(99);

                }
                else
                {

                    if (FtpStatusCode.ActionNotTakenFileUnavailable == response.StatusCode)
                    {

                        return false;
                    }
                }
            }

        return true;
        }


    }



}

preguntado el 28 de agosto de 12 a las 11:08

¿Están todos los archivos en el mismo directorio remoto? -

@paul sí en un servidor remoto en un directorio. -

1 Respuestas

tal vez podrías usar WebRequestMethods.Ftp.ListDirectoryDetails, esto le daría una lista de todos los archivos remotos con una sola llamada. Podrías guardar esto en un List<string> y luego simplemente verifique cada fila de la base de datos con esta lista.

Respondido 28 ago 12, 12:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.