C# ile FTP’den Günlük CSV Faturalarını Almak

Merhaba,

Raporlarımız için hayati önem arz eden ve datawarehouse’muzu besleyen fatura tutar bilgilerinin nasıl ftp’den alındığını ve etl sürecinde nasıl kullanıldığını sizlere anlatacağım.

Öncelikle günlük olarak her gün faturaların geldiği bir ftp sunucusu düşünelim ve biz de bu csv formatındaki faturaları alıp etl sürecimizde kullanarak raporlarımızın kaynağı olan datawarehouse tablolarına aktarmak istiyoruz.

Bunun için öncelikle .NET Framework 4.6.1 ile yazacağımız bir console uygulaması yeterli olacaktır.

Aşağıdaki kodda bahsi geçen parametrelerden url (bağlanacağınız adresi), user (bağlanacağınız ftp hesabının kullanıcı adı), pass (bağlanacağınız ftp hesabının parolası), path (dosyaları kaydedeceğiniz dizin) temsil etmektedir. Sizin buraları kendinize göre değiştirmeniz gerekiyor.

Aşağıdaki kodda günlük olarak dört farklı tipteki (F,T,C,P) fatura dosyalarını bağlandığımız FTP sunucucusundan belirttiğimiz dizine kaydediyoruz.

Akabinde herşey tamam ise, işlemin başarılı olduğuna dair mail alıyoruz, değilse hata mesajını alıyoruz.

Kodumuzu derledikten sonra ismini ftp.exe olarak değiştiriyorum ve artık etl akışında kullanmam için önümde hiçbir engel yok.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;

namespace FATURA
{
    class Program
    {
        static void Main(string[] args)
        {
            /********************************************************************************************/

            string FATURAC = ""; string FATURAT = ""; string FATURAF = ""; string FATURAP = "";

            string IFATURAC = ""; string IFATURAT = ""; string IFATURAF = "";

            /********************************************************************************************/

            MailMessage message = new MailMessage();
            message.To.Add("mail@mail.com");
            message.CC.Add("mail@mail.com");
            message.IsBodyHtml = true;
            message.From = new MailAddress("mail@mail.com");
            SmtpClient smtp = new SmtpClient("1.1.1.1");

            /********************************************************************************************/

            string url = "ftp://212.212.212.212/Fatura/";
            string user = "username";
            string pass = "password";
            string path = "C:\\inbox\\Fatura\\";

            string year = DateTime.Now.AddYears(0).Year.ToString();
            string month = DateTime.Now.AddYears(0).Month.ToString();
            string day = DateTime.Now.AddYears(0).Day.ToString();

            if (month.Length == 1) { month = "0" + month; }
            if (day.Length == 1) { day = "0" + day; }

            string date = year + month + day;

            /********************************************************************************************/

            try
            {
                DownloadFile(user, pass, url + "FATURAC" + date + ".CSV", path + "FATURAC" + date + ".CSV");
                FATURAC = "FATURAC Success";
                
            }

            catch (Exception e)
            {
                FATURAC = "<b>FATURAC Failed:</b> " + e.Message;
                IFATURAC = "FATURAC";
            }

            /********************************************************************************************/

            try
            {
                DownloadFile(user, pass, url + "FATURAF" + date + ".CSV", path + "FATURAF" + date + ".CSV");
                FATURAF = "FATURAF Success";
            }

            catch (Exception e)
            {
                FATURAF = "<b>FATURAF Failed:</b> " + e.Message;
                IFATURAF = "FATURAF";
            }

            /********************************************************************************************/

            try
            {
                DownloadFile(user, pass, url + "FATURAT" + date + ".CSV", path + "FATURAT" + date + ".CSV");
                FATURAT = "FATURAT Success";
            }

            catch (Exception e)
            {
                FATURAT = "<b>FATURAT Failed:</b> " + e.Message;
                IFATURAT = "FATURAT";
            }

            /********************************************************************************************/

            try
            {
                DownloadFile(user, pass, url + "FATURAP" + date + ".CSV", path + "FATURAP" + date + ".CSV");
                FATURAP = "FATURAP Success";
            }

            catch (Exception e)
            {
                FATURAP = "<b>FATURAP Failed:</b> " + e.Message;
            }


            if (IFATURAC == "FATURAC" || IFATURAT == "FATURAT" || IFATURAF == "FATURAF")
            {
                message.Subject = "FATURA FTP FAILED";
                message.Body = FATURAC + "
" + FATURAF + "
" + FATURAT + "
" + FATURAP;
                smtp.Send(message);

            }

            else
            {
                message.Subject = "FATURA FTP SUCCESS";
                message.Body = FATURAC + "
" + FATURAF + "
" + FATURAT + "
" + FATURAP;
                smtp.Send(message);
            }

            Environment.Exit(0);

            /********************************************************************************************/
        }

        public static FtpWebRequest CreateFtpWebRequest(string ftpDirectoryPath, string userName, string password, bool keepAlive = false)
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(ftpDirectoryPath));

            request.Proxy = null;

            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = keepAlive;

            request.Credentials = new NetworkCredential(userName, password);

            return request;
        }

        public static void DownloadFile(string userName, string password, string ftpSourceFilePath, string localDestinationFilePath)
        {
            int bytesRead = 0;
            byte[] buffer = new byte[2048];

            FtpWebRequest request = CreateFtpWebRequest(ftpSourceFilePath, userName, password, true);
            request.Method = WebRequestMethods.Ftp.DownloadFile;

            Stream reader = request.GetResponse().GetResponseStream();
            FileStream fileStream = new FileStream(localDestinationFilePath, FileMode.Create);

            while (true)
            {
                bytesRead = reader.Read(buffer, 0, buffer.Length);

                if (bytesRead == 0)
                    break;

                fileStream.Write(buffer, 0, bytesRead);
            }

            fileStream.Close();
        }
    }
}

Daha sonra ftp.exe console uygulamamızı SQL Server üzerinde T-SQL kodu ile aşağıdaki gibi kullanabiliriz.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE

EXEC master..xp_cmdshell 'C:\ftp.exe'

EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE
EXEC sp_configure 'show advanced options', 0
RECONFIGURE

Kolay gelsin.

Bir Cevap Yazın