0

これは、テーブル列のファイル名がftpサーバーディレクトリに存在するかどうかを確認し、存在する場合は更新クエリを使用して、値を持つIsexists列をそのまま更新するために作成1しました。

DataTableを使用して各行(ファイル名)を読み取り、FtpWebRequestを常に作成して、ファイルが存在するかどうかを確認しています。

このようにCheckIfFtpFileExists(string fileUri)回数の呼び出しを取得することは、noに等しいです。DataTableの行の数。

FTP認証を作成する方法はありますか?一度だけ、関数を呼び出します。

提案速度を上げるためにコードを改善するにはどうすればよいですか。

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;
        }


    }



}
4

1 に答える 1

-1

おそらく を使用できますWebRequestMethods.Ftp.ListDirectoryDetails。これにより、1 回の呼び出しですべてのリモート ファイルのリストが得られます。これを に保存してList<string>から、データベースの各行をこのリストと照合するだけです。

于 2012-08-28T11:04:15.170 に答える