Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

C# ile Sertifika Yükleme

Merhabalar,
İş yerinde bir sertifika geçişimiz oldu ve bunu kod ile cihazlara yüklememiz gerekti. Hemen ufak bir uygulama yazdım ve işe yarayabileceğini düşünerek paylaşıyorum. AddCert() metodundaki parametreleri değiştirerek sertifikayı istediğimiz yere yükleyebiliriz. Aşağıdaki kod örneğimde Personal altına yükleme yapıyoruz.  Run->mmc yazarak PC’nizde yüklü olan sertifikaları inceleyebilirsiniz.

Capture


class Program
{
static void Main(string[] args)
{
Console.WriteLine("Loading has started......");
var cert = new X509Certificate2("CertificateName.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
AddCert(StoreName.My, StoreLocation.LocalMachine, cert);
AddAccessToCertificate(cert, "IIS_IUSRS");
Console.WriteLine("Loading has finished......");
}
private static void AddCert(StoreName storeName, StoreLocation storeLocation, X509Certificate2 cert)
{
X509Store store = new X509Store(storeName, storeLocation);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();
}

private static void AddAccessToCertificate(X509Certificate2 cert, string user)
{
RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;

if (rsa != null)
{
string keyfilepath =
FindKeyLocation(rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileInfo file = new FileInfo(keyfilepath + "\\" +
rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileSecurity fs = file.GetAccessControl();

NTAccount account = new NTAccount(user);
fs.AddAccessRule(new FileSystemAccessRule(account,
FileSystemRights.FullControl, AccessControlType.Allow));

file.SetAccessControl(fs);
}
}
private static string FindKeyLocation(string keyFileName)
{
string text1 =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string text2 = text1 + @"\Microsoft\Crypto\RSA\MachineKeys";
string[] textArray1 = Directory.GetFiles(text2, keyFileName);
if (textArray1.Length > 0)
{
return text2;
}
string text3 =
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string text4 = text3 + @"\Microsoft\Crypto\RSA\";
textArray1 = Directory.GetDirectories(text4);
if (textArray1.Length > 0)
{
foreach (string text5 in textArray1)
{
textArray1 = Directory.GetFiles(text5, keyFileName);
if (textArray1.Length != 0)
{
return text5;
}
}
}
return "Private key exists but is not accessible";
}
}

December 23, 2015 Posted by | C# | , , , , | Leave a comment

Yazılım Kalite Buzdağı

Geliştirilen yazılımlarda genellikle buz dağının görülen tarafı ile ilgilenilir ancak gerçek şudur ki buz dağının görülmeyen tarafında kaliteyi etkileyen faktörler çok daha fazladır. Biz genellikle yazılımları test ettiririz ve UI testinden geçerse, yani sadece çalışırsa çoğu zaman production’a çıkma onayı verilir. Ama etkin bir code review yapıldığında gerçeklerle yüzleşmeye hazır olun :) Görünmeyen tasarımsal ve kodsal yanlışlar bir süre sonra başınıza bela olabilir veya siz o projeden ayrıldıktan sonra yeni gelen bir yazılımcı kulaklarınız çınlatabilir. O yüzden nasıl bulmak istiyorsan öyle bırak, Yaptığın işe özen göster ve asla baştan savma yapma :)

qualityIceberg
Alıntı : Steve McConell

 

July 11, 2015 Posted by | Yazılım | , | Leave a comment

Nedir Bu XTM?

XTM yazılımı tamamen Kuveyt Türk mühendisleri tarafından geliştirilen ve bankacılığa yeni bir soluk getirmeyi hedefleyen inovatif bir ürün olarak karşımıza çıkmakta. İlk bakışta görüntülü ATM gibi algılansa da, işin içerisine girdiğinizde aslında yeni bir şube konsepti olduğunu söyleyebiliriz. XTM’lerden para çekip, para yatırabilir, hesap açabilir, özel eğitimli müşteri temsilcileri ile görüntülü görüşme yapabilir, dijital olarak evrak paylaşımı yapılabilir, kredi kullanılabilir, dekont ve A4 çıktı verebilir, tarama yapabilir, banka kartı basabilir, kısacası bir şubeye gidip yapabildiğiniz hemen hemen her işlemi gerçekleştirebilirsiniz. Bu açıdan baktığınızda şube maliyetlerini azaltılıp Kuveyt Türk’e rekabet avantajı sağlamaktadır ve ilerde çok daha fazla ses getirecektir..  Tek bir XTM dijital şubesi ATM, internet şube, çağrı merkezi ve şube fonksiyonlarının harmanlanmasından oluşmaktadır.

xtm v2

Uzun uğraşlar sonucu elle tutulur, stabil bir ürün haline getirilen XTM oldukça olgunlaştı ve 2. nesli de piyasaya çıkmaya hazırlanıyor. Her XTM versiyonu artık yapılamaz deneni yapıyor ve bankacılık sektöründe de çığır açmaya devam ediyor. Şu an çok fazla reklamı yapılmamasına rağmen fısıltı gazetesiyle kulaktan kulağa yayılmakta ve görenlerin yoğun ilgilisini çekmektedir. Öyle ki Arjantinden, Çin’e , Mısırdan Polonyaya kadar bir çok banka XTM’i görmek için ofisimize site visitlerde bulundular.  XTM bu başarısını 2014 de rakamlarla da ispatladı ve oldukça karlı bir yatırım olacağının sinyallerini de vermiş oldu.

Bu tarz projeler ülkemiz adına da büyük bir kazanç ve devletin de bu ar-ge projemizi destekliyor olması oldukça sevindirici.  Emeği geçen herkesin ellerine sağlık. Umarım ekibimizde çok daha büyük işlere imza atarız.
IMG-20150615-WA0000

XTM ile bir çok fuara ve seminere katıldık, ödüller aldık.
Büyük Firma Dalında Yenilikçiliğin Ticarileştirilmesi Ödülü –  http://www.tesid.org.tr/tsd/ttPage.asp?pageID=213#sthash.REiCOJaB.dpuf
SIBOS – https://www.sibos.com/exhibition/about-exhibition/exhibitors/kuveyt-turk-participation-bank-rd-center
CEBIT  – http://www.cebitbilisim.com
CNR EXPO Ar-ge fuarı – http://cnrexpo.com

XTM ile ilgili daha detaylı bilgi için aşağıdaki linkleri ziyaret edebilirsiniz.
http://www.kuveytturk.com.tr/xtm.aspx
http://architecht.com/en/products/xtm




June 15, 2015 Posted by | Ödeme Sistemleri, Yazılım, Yaşam | , , | Leave a comment

WPF Threading Modeli

Yazılım geliştirirken hep şu thread’ler başımın belası olmuştur. Öldürürsün ölmez,  açık kalır, debug ederken sıkıntı, memory şişer bulurken göbeğin çatlar, Pool’a at geri çağır sürekli hep sıkıntı yaratır. Bu dezavantajları olmasına rağmen onsuz da olmuyor ne yazık ki.  Neyseki Microsoft WPF ile birlikte thread kullanımını bana bırak sen business’a odaklan demeye başladı. Çünkü aslında hayal ettiğimiz birinci resimdeki gibi olmasına rağmen, gerçekleşen ne yazık ki ikinci resimdeki gibi olabiliyor :)

HAYALİMDEKİ MULTITHREADING                           ASLINDA OLAN MULTITHREADING
thread1               Thread2
WPF de temel olarak geri planda 2 thread bulunmakta; birisi rendering için diğeri UI’ı yönetmek için kullanılır.
Rendering thread UI’a veri getirirken, ekrana çizim yaparken, eventler’i handle ederken devreye girer.  UI Thread’i ise genellikle 1 tane olur, bazı durumlarda birden fazla da olabilir.

UI Thread’i çalışacak parçaları Dispatcher denen bir nesnede kuyruğa sokar ve öncelik sırasına göre çalıştırır. HEr bir UI threadi en az bir Dispatcher, ve herbir Dispatcher iş parçacıkları sadece 1 thread de çalıştırabilir. WPF de çoğu nesne DispatcherObject sınıfından türer.

Yazdığımız programın müşterileri memnun etmesi için tabi ki müşterinin her butona bastığında, her işlem yaptığında programın hızlıca cevap vermesi gerekiyor ve buradaki anahtar nokta da Dispatcher kuyruğuna atılacak iş parçacıklarının küçük olmasıdır, bu yöntem ile iş parçacıklarını kuyrukta fazla bekletmemiş oluruz.

Genel mantık olarak uzun sürecek işlemleri ana UI thread’inde değil ayrı bir thread de yapmamız gerekiyor. Eskiden windows uygulamaları yazarken bir UI nesnelerine sadece onu oluşturan thread üzerinden erişebilirken, WPF ile birlikte farklı thread’lerden de UI nesnelerini güncelleyebiliyoruz. Örneğin bir datagridi ana thread’den bağımsız olarak arka planda güncelleyebiliyor olmak büyük veriler ile çalışırken çok faydalı olacaktır. WPF bunu ana UI thread’inin dispatcherına iş parçacıkları register ederek sağlıyor. Dispatcher.Invoke, Dispatcher.BeginInvoke metodları bu register işlemini yapar. Invoke senkron, BeginInvoke asenkron çalışır. Bunların önceliklerini de DispatcherPriority enumu ile belirtebilirsiniz.

Örnek kullanım : Yeni bir thread açarak dispatcher invoke yöntemiyle UI daki listbox ekran kilitlenmeden doldurulabiliyor.

Thread tt = new Thread(FillListBox);
tt.Start();

private void FillListBox()
{
for (int i = 0; i < 500; i++)
{
listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
listBox1.Items.Add(“A” + i.ToString());
});

Thread.Sleep(100);

}
}

May 28, 2015 Posted by | C#, WPF | , , , , | Leave a comment

Ödeme Sistemleri Serüveni

Uzun yıllar farklı alanlar ve departmanlarda çeşitli projelerde yer aldıktan sonra, son 2 yıldır da ödeme sistemlerinde yazılım geliştirmeye devam ediyorum. Ödeme sistemlerine geçtiğimde yazılım geliştirmek için sadece programlama bilmenin yeterli olmadığı gerçeğiyle yüzleştim. Ödeme sistemleri aslına baktığımızda çok fazla know-how gerektiriyor ve uçsuz bucaksız bir deniz gib. Bu konuda Türkiye’de çok fazla yetişmiş iş gücü kısıtlı. Bu alanda da yine yabancı yazılım ve standartları kullanmak zorundayız. Konuyla ilgili Türkçe kaynak bulmak neredeyse imkansız çünkü oldukça niş bir alan. Ben de bu konuda öğrendiğim konuları hem öğrendiklerimi pekiştirmek hem de bu alana yönlenmek isteyenlere faydalı olabilmek adına bir yazı dizisi şeklinde zaman içerisinde paylaşmayı hedefliyorum.
images

Ödeme sistemleri denince ilk akla gelen tabi ki kredi kartları ancak ödeme sistemleri çatısı altında bilgi sahibi olunması gereken o kadar çok kavram var ki , bunlar yazılım geliştirmenin çok ötesinde uzmanlık gerektiren konular.  Standartlar, sertifikasyonlar, kurallar, şifreler, chipler, doğrulamalar algoritmalar ve daha bir sürü konu. En basit tabiriyle ödeme sistemleri dediğimizde aklımıza ödeme yapabildiğimiz kanalları aklımıza getirmemiz gerekiyor. Bir ürün aldığınızda kredi kartınızı POS’a takıp şifrenizi girmenizle başlayan süreç, paranın satıcının hesabına geçirilene kadar geçen süreç veya ATM den işlem yapmak istediğinizde kartınızı cihaza takıp şifrenin doğrulanması veya internetten kredi kartınızla online alışveriş yaparken

POS_

Eğer bu sektöre girdiyseniz veya girmek istiyorsanız ister istemez aşağıda listelemiş olduğum bazı kısaltma ve terimlere aşına olmanız gerekiyor diye düşünüyorum. Yeri geldiğinde bunlarla ilgili konulara daha detaylı değineceğiz ancak bu ilk yazımızda genel bir vizyon sahibi olmak adına bir girizgah yapacağız.

ATM (Automated Teller Machine) :
HSM
(Hardware Security Module) :
XFS (Extensions for Financial Services ) :
EMV (Europay-MasterCard-VISA) :
RKL (Remote Key Loading) :
ISO (International Organization for Standardization) :
PCI (Payment Card Industry) :
PCI DSS (Payment Card Industry Data Security Standart) :
BKM (Bankalararası Kart Merkezi) :
3D Secure :
Debit/Credit Card :
NFC (Near Field Communication) : 
POS (Point Of Sale): Fiziksel kartla ödeme noktası.
VPOS (Virtual Point Of Sale) : Sanal Pos
Acquirer Bank : Ödemenin alınacağı POS’un bağlı olduğu bankadır ve anlaşmaları doğrultusunda satıcıya aktarır.
Issuer Bank :  Kartı düzenleyen bankadır.
Merchant : Üye İşyeri
Payment Switch :
BIN (Bank Identification Number)
IIN (Issuer Identification Number):
Clearing (Takas) :
Authorization : Provizyon;
PIN : Şifre
Fraud : Sahte işlemler
Chargeback : Kart hamilinin işlemin kendisine ait olmadığını bildirdiği tutar.
End of Day : Günsonu işlemi
OTP : One Time Password
CHIP : Para kartlarının ve
CVC2 : Kredi kartının arkasındaki 3 haneli güvenlik kodudur.

Aşağıdaki şekilde de bir ödeme işleminin müşteriden satıcıya kadar geçen adımları numaralandırarak çok güzel bir şekilde açıklıyor.

transflow

Referanslar 
http://howbankswork.com/what-is-a-merchant-acquirer/
http://www.fidelitypayment.com/resources/what_are_merchant_services
http://livecashless.com/costi-del-pos-arrivano-primi-risultati-dal-tavolo-tecnico/
http://www.odemesistemleri.org/
http://en.wikipedia.org/wiki/Payment_system

 

January 18, 2015 Posted by | Ödeme Sistemleri | , , , , , , , , , , , , , , | Leave a comment

Yazılımcılık ve Futbolculuk

Başlığı gördüğünüzde ne alaka diyebilirsiniz ancak ben yazılımcının kariyerini bir futbolcuya benzetiyorum. Neden derseniz ikiside 35 yaşında gözden düşüyor.  Günümüzde hepimizin bildiği gibi yazılım geliştirme sadece gençlerin oynadığı bir oyun olarak görülüyor ve  yaşlı programcılar iş bulmakta zorlanıyor. Hele ki sadece belli bir alanda uzmanlaşmış ise kriterlerine uygun iş bulması neredeyse imkansızlaşıyor. 30lu yaşlara kadar bir yıldız gibi parlayan yazılımcılar 35den sonra yavaş yavaş sönükleşiyor maalesef.

California Üniversitesinden Profesör Norman Matloff’ da yaptığı araştırmada 35 yaşından sonra programcılar iş bulma olasılığının azaldığını gözlemlemiş. İstatistikler programcıların 40 yaşından sonra genellikle mevcut pozisyonlarından ayrıldıklarını gösteriyor. Peki bu programcılara ne oluyor, hepsini ıssız bir adaya mı gönderiyorlar veya emlakçı, bakkal, manav gibi farklı mesleklere mi geçiş yapıyorlar? Yada her yazılımcının işten bunaldığı anlarda söylediği gibi köy hayatına geçiş mi yapıyorlar, “Yaw bıktım kod yazmaktan, memlekete dönücem 2 inek alıp çiflik hayatı sürücem ” eminim çevrenizde bir çok yazılımcının ağzından buna benzer cümleleri duymuşsunuzdur.  İşin doğrusu ise bir çok tecrübeli yazılımcı ya proje yönetimine geçiyor, ya danışman olarak firmalarına hizmet vermeye devam ediyor ya da kendi işini kurup kendi yolunda ilerliyor.

Özellikle ülkemizde yazılım anlamında tecrübeye çok da gerek olmayan bir sürü iş var. Zaten iş ilanlarına baktığınızda bunu daha net görüyorsunuz. Her şeyi bilsin ama 30 yaşını geçmesin, her şeyden azar azar bilsin ama hepsini bilsin, ne iş versem yapsın mantığı var.  Cem Yılmaz’ın dediği gibi “Little Little in to the Middle” olayı yani :) Spesifik iş ilanları çok göremezsiniz ki bu bize ülkemizin yazılımların çoğunun veritabanından bilgi getirip ekranda göstermenin ötesinde çok da bir şey yapılmadığına işaret ediyor. Durum böyle olunca firma da haklı olarak tecrübeli yazılımcıya ne diye fazla para vereyim demekte haklı çünkü düzen bu şekilde.

Tüketim toplumu olmanın ceremesini maalesef yazılım sektörü de çekiyor. Bu kadar genç nüfusumuz olmasına rağmen dünya arenasında boy gösterecek yazılımımız yok maalesef. Sadece yazılım değil donanım konusunda da durum aynı, her konuda dışarıya bağımlıyız. Arge projelerine ülke olarak yeteri kadar kaynak ayıramıyoruz maalesef. Niş alanlarda uzmanlaşamıyoruz. Bunları söylerken bir yandan da kendi öz eleştirimi de yapıyorum haliyle. Bir alanda uzmanlaşmadan diğer bir alana atlıyoruz. Hepimiz birilerinin sırtına basarak yönetici,müdür olma derdindeyiz, kısa yoldan köşeyi dönelim, şirket araba, telefon versin rahat yaşayalım, az çalışalım, 2+1 yetmez 4+1 evim olsun derdindeyiz.

Daha üniversiteden yeni mezun olan arkadaş ben proje yöneticisi olucam deyip çıkıyor, Yav arkadaş bi 2 satır kod yazaydın, bu acele ne. Çevrenin de poh pohuyla emeklemeden yürümeye çalışıyorlar. Bu arkadaşlara kızamıyorum da esasında çünkü kültürümüz bu şekilde.  kimse asker olmak istemiyor, herkes komutan olmanın derdinde. Ama şunu unutmayalım ki savaşı her ne kadar komutan yönetse de cengaver askerleri olmayan bir ordu yenilmeye mahkumdur.

Amerikada Microsoft’u ziyaret ettiğimizde şunu gördüm, bir adam sadece SQL’in bir parçasıyla ve Visual Studio’nun bir Add-In iyle yıllardır uğraşıyor ve her türlü detayını biliyor, daha iyisini nasıl yaparım diye kafa yoruyor. Böyle olunca o adamın ve ürünün de değeri artıyor, dünyada rekabet ediyor. O yazılımcı artık bilgisiyle yeni gelenlere önderlik ediyor, yol gösteriyor, kaliteye performansa odaklanıyor. Çin, Hindistan gibi ülkeler ise çok agresif bir şekilde sektöre girdiler ve şu anda gerçekten çok yol katettiler. Zaten yabancı sitelere baktığınızda bir çok başarılı projenin altında imzaları var. Devlet destekleri hat safhada.

Uzun lafın kısası Türkiye’de yazılımcılarla futbolcuların kaderleri birbirine çok benzetiyorum. İyi bir kariyer için doğru adımlar atmak şart yoksa ıskartaya çıkarılabilirsiniz. Belli bir genel tecrübeye ulaştıktan sonra niş bir alanda uzmanlaşıp hem kendine, hem firmasına, hem de ülkesine daha faydalı olunacağı kanaatindeyim. İnşallah biz de bir gün yazılımda ve donanımda dünyada ses getirebilir seviyelere ulaşabiliriz. 2015 de yazdığım bu ilk yazımda hem millet hem de kendi adıma biraz öz eleştiri yapmak biraz da içimi dökmek istedim, umarım başınızı şişirmemişimdir…

 

 

 

January 10, 2015 Posted by | Yaşam | , | 2 Comments

C# ile Video Recorder

Merhabalar, bir ihtiyaç neticesinde bilgisayarın ekran görüntüsünü video şeklinde kaydetme ihtiyacım oldu. Çözümü microsoftun bir dll i sayesinde oldukça kolaylaştı.   Microsoft.Expression.Encoder.ScreenCapture ‘ı projemize referans verdikten sonra aşağıdaki kod yardımı ile ekranın videosunu çekmeye hemen başlayabiliyorsunuz.  İster ekranın tamamını ister bir bölümünü alabilirsiniz. Videonun kalitesini ve saniyedeki frame sayısı gibi özelliklerini set edebilirsiniz.

Bu linkten dll’i download edebilirsiniz.

Rectangle _screenRectangle = Screen.PrimaryScreen.Bounds;
 ScreenCaptureJob _screenCaptureJob = new ScreenCaptureJob();
 _screenCaptureJob.CaptureRectangle = _screenRectangle;
 _screenCaptureJob.ShowFlashingBoundary = true;
 _screenCaptureJob.ScreenCaptureVideoProfile.FrameRate = 20;
 _screenCaptureJob.CaptureMouseCursor = true;

 _screenCaptureJob.OutputScreenCaptureFileName = string.Format(@"C:\test.wmv");
 if (File.Exists(_screenCaptureJob.OutputScreenCaptureFileName))
 {
 File.Delete(_screenCaptureJob.OutputScreenCaptureFileName);
 }
 _screenCaptureJob.Start();</pre>
<pre>

December 13, 2014 Posted by | C#, Yazılım | , , , , | Leave a comment

Bir tablo adı geçen Stored Procedure’lerin listesini almak.

Bir tablo adının geçtiği stored prosedürleri bulmak için aşağıdaki select ten faydalanabilirsiz.  Tabi sadece tablo adı değil herhangi bir kelime de aratabilirsiniz.  Bundan sonraki arama işlemleri artık yaratıcılığınıza kalmış.
SELECT DISTINCT *
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
INNER JOIN sys.procedures AS p ON p.[object_id]=sc.id
INNER JOIN sys.schemas s ON s.[schema_id] = p.[schema_id]
WHERE sc.TEXT LIKE ‘%TABLE_NAME%’ AND s.name = ‘SCHEMA_NAME’

September 23, 2014 Posted by | MSSql | , | Leave a comment

Bat ile Scheduled Task Oluşturma

Merhabalar,

bat uzantılı dosyalar bildiğiniz gibi windows komutları çalıştırmamıza yarayan küçük programcıklardır. Bu örneğimizde işyerinde işime yarıyan bir scheduled task yani zamanlanmış görev  örneğini paylaşıyor olacağım.

Bir text dosyasına aşağıdaki scripti kopyalayıp uzantısını da .bat olarak kaydederseniz, dosyaya çift tıkladığınızda zamanlanmış görevi oluşturmuş olacaktır.

schtasks /create /tn “ServisAdı” /tr “c:\xxxxx.exe” /sc DAILY /st 23:00:00 /sd 01/01/2014 /ru KullaniciAdi /rp Sifre

Zamanlanmış Görevi doğru oluşturup oluşturmadığına Bilgisayarıma sağ tıklayıp Manage diyerek Task Scheduler kısmından bakabilirsiniz.

Untitled

 

 

April 18, 2014 Posted by | Donanım, İpucu | , , | Leave a comment

C# Ftp sınıfı

Aşağıdaki sınıf ile c# da FTP upload, download, delete gibi işlemleri yapabilirsiniz.

public class FTP
    {
        private string host = null;
        private string user = null;
        private string pass = null;
        private FtpWebRequest ftpRequest = null;
        private FtpWebResponse ftpResponse = null;
        private Stream ftpStream = null;
        private int bufferSize = 2048;

        public FTP(string hostIP, string userName, string password)
        {
            host = hostIP; user = userName; pass = password;
        }

        public void Download(string remoteFile, string localFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                FileStream localFileStream = new FileStream(localFile, FileMode.Create);
                byte[] byteBuffer = new byte[bufferSize];
                int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                try
                {
                    while (bytesRead > 0)
                    {
                        localFileStream.Write(byteBuffer, 0, bytesRead);
                        bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                    }
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                localFileStream.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Download: ",ex);
            }
            return;
        }

        public void Upload(string remoteFile, string localFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                ftpStream = ftpRequest.GetRequestStream();
                FileStream localFileStream = new FileStream(localFile, FileMode.Create);
                byte[] byteBuffer = new byte[bufferSize];
                int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                try
                {
                    while (bytesSent != 0)
                    {
                        ftpStream.Write(byteBuffer, 0, bytesSent);
                        bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                    }
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                localFileStream.Close();
                ftpStream.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Upload: ", ex);
            }
            return;
        }

        public void Delete(string deleteFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + deleteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Delete: ", ex);
            }
            return;
        }

        public void Rename(string currentFileNameAndPath, string newFileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + currentFileNameAndPath);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.Rename;
                ftpRequest.RenameTo = newFileName;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Rename: ", ex);
            }
            return;
        }

        public void CreateDirectory(string newDirectory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + newDirectory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP CreateDirectory: ", ex);
            }
            return;
        }

        public string GetFileCreatedDateTime(string fileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + fileName);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.GetDateTimestamp;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string fileInfo = null;
                try
                {
                    fileInfo = ftpReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP GetFileCreatedDateTime1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                return fileInfo;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP GetFileCreatedDateTime2: ", ex);
            }
            return "";
        }

        public string GetFileSize(string fileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + fileName);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string fileInfo = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        fileInfo = ftpReader.ReadToEnd();
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP GetFileSize1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                return fileInfo;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP GetFileSize2: ", ex);
            }
            return "";
        }

        public string[] DirectoryListSimple(string directory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string directoryRaw = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        directoryRaw += ftpReader.ReadLine() + "|";
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListSimple1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                try
                {
                    string[] directoryList = directoryRaw.Split("|".ToCharArray()); return directoryList;
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListSimple2: ", ex);
                }
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP DirectoryListSimple3: ", ex);
            }
            return new string[] { "" };
        }

        public string[] DirectoryListDetailed(string directory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string directoryRaw = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        directoryRaw += ftpReader.ReadLine() + "|";
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListDetailed1: ", ex);
                }
                /* Resource Cleanup */
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                /* Return the Directory Listing as a string Array by Parsing 'directoryRaw' with the Delimiter you Append (I use | in This Example) */
                try
                {
                    string[] directoryList = directoryRaw.Split("|".ToCharArray());
                    return directoryList;
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListDetailed2: ", ex);
                }
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP DirectoryListDetailed3: ", ex);
            }
            return new string[] { "" };
        }
    }

April 2, 2014 Posted by | Yazılım, C# | , , , , | 1 Comment

Follow

Get every new post delivered to your Inbox.

Join 60 other followers

%d bloggers like this: