using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Windows.Forms; namespace EstrazioneAnagrafica { public abstract class ProgramLogic { //global variables, we love them! private System.ComponentModel.BackgroundWorker backgroundWorker1; private System.ComponentModel.BackgroundWorker backgroundWorker2; private bool done; //that's a mess ;) public ProgramLogic() { // // backgroundWorker1 // backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); // // backgroundWorker2 // backgroundWorker2 = new System.ComponentModel.BackgroundWorker(); this.backgroundWorker2.WorkerReportsProgress = true; this.backgroundWorker2.WorkerSupportsCancellation = true; this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork); this.backgroundWorker2.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker2_ProgressChanged); this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted); } //running console application public void StartConsole(){ try { done = false;//since we are using threads we need to keep our console alive backgroundWorker1.RunWorkerAsync(); while (!done) { Thread.Sleep(100); //dont kill the console please! } } catch (Exception ex) { PushErrorStatus(ex.Message); } } //running windows forms application public void StartForm() { try { backgroundWorker1.RunWorkerAsync(); //no need to keep anything alive. Form never dies } catch (Exception ex) { PushErrorStatus(ex.Message); } } #region notificators public abstract void PushStatus(string message); //those we use to show messages to the User. public abstract void PushErrorStatus(string message); //implementation depedns on mode in which we run the software public abstract void PushSuccessStatus(string message); #endregion #region worker2 private void backgroundWorker2_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { done = true; PushSuccessStatus(null); //System.Threading.Thread.Sleep(5000);//this codes make your application waiting for 5 seconds //sistemo i pulsanti e la label //TODO //lblAttendere.Visible = false; //button1.Enabled = true; } private void backgroundWorker2_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { if (e.ProgressPercentage == 10) { PushStatus("Rinomino il file sulla macchina target (Bolsena)......"); //lblAttendere.Text = "Rinomino il file sulla macchina target (Bolsena)......"; //lblAttendere.Visible = true; } else if (e.ProgressPercentage == 40) { PushStatus("Invio il file via FTP......"); //lblAttendere.Text = "Invio il file via FTP......"; } else if (e.ProgressPercentage == 100) { PushStatus("Invio terminato!!!"); //lblAttendere.Text = "Invio terminato!!!"; } } private void backgroundWorker2_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { try { //prima di inviare il nuovo flusso, rinomino il vecchio con la data attuale backgroundWorker2.ReportProgress(10); rinominaFileFtp(); //lancio ftp verso la macchina condivisa \\bolsena backgroundWorker2.ReportProgress(40); inviaFlussoHostFTP(); //fine backgroundWorker2.ReportProgress(100); } catch (Exception ex) { PushErrorStatus(ex.Message); done = true; } } #endregion //voodoo made by 2nd worker #region worker1 private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { if (!done) { PushSuccessStatus("background worker1 job finished"); backgroundWorker2.RunWorkerAsync(); } else PushErrorStatus("Process cancelled due to the errors"); //lblAttendere.Visible = false; } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { if (e.ProgressPercentage == 20) { PushStatus( "Estraggo gli indirizzi dal db......."); //lblAttendere.Text = "Estraggo gli indirizzi dal db......."; } else if (e.ProgressPercentage == 40) { PushStatus( "Creo il file txt......"); //lblAttendere.Text = "Creo il file txt......"; } else if (e.ProgressPercentage == 80) { PushStatus("Creazione TXT terminata!!!"); //lblAttendere.Text = "Creazione TXT terminata!!!"; } } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { try { Log.ScriviLog("Preparo estrazione indirizzi"); //-----------------------------------------------------lancio la sp 'Estrazione_Indirizzi_CO' backgroundWorker1.ReportProgress(20); DataTable tabellaIndirizzi = LanciaEstrazioneIndirizzi(); if (tabellaIndirizzi.Rows.Count == 0) { //System.Windows.Forms.Application.Exit(); Log.ScriviLog("Fine procedura - Nessun indirizzo estratto"); throw new Exception("no data"); } //prima di scrivere il txt rinomino l'eventuale esistente ControllaErinomina(); //-----------------------------------------------------dalla tabella scrivo un txt backgroundWorker1.ReportProgress(40); CreaTxt(tabellaIndirizzi); //fine backgroundWorker1.ReportProgress(80); } catch (Exception ex) { PushErrorStatus(ex.Message); done = true; } } #endregion //voodoo made by 1st worker //then it will start worker2 #region helpers //se c'è un altro file txt target nella directory lo rinomino con la data del giorno (es: EstrazioneIndirizziCO_20151111.txt) private void ControllaErinomina() { PushStatus("Reading configuration"); Log.ScriviLog("ControllaErinomina... Start "); string pathOut = UtilityManager.getAppSetting("Application_Folder"); PushStatus("Application Folder " + pathOut); string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"]; PushStatus("Estensione File Host " + estensioneFile); string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"]; PushStatus("Nome File Host " + nomeFile); string ftpServerHost = ConfigurationManager.AppSettings["FTPServerHost"]; PushStatus("FTP Server host " + ftpServerHost); string nomeFileOut = nomeFile + estensioneFile; string extensionFilter = nomeFileOut; string[] filePaths = Directory.GetFiles(pathOut, extensionFilter); if (filePaths.Length > 0) { try { //il file è stato trovato, lo rinomino string nuovoNomeFile = nomeFile + "_" + DateTime.Now.ToString("yyyyMMdd") + estensioneFile; string oldPath = pathOut + "\\" + nomeFileOut; string newPath = pathOut + "\\" + nuovoNomeFile; System.IO.File.Move(oldPath, newPath); } catch (Exception e) { PushErrorStatus(e.Message); //probabilmente il file già esiste non faccio nulla; } } PushSuccessStatus("Reading configuration completed "); Log.ScriviLog("ControllaErinomina... Fine "); } private void CreaTxt(DataTable tabellaIndirizzi) { Log.ScriviLog("CreaTxt... Start "); string pathOut = UtilityManager.getAppSetting("Application_Folder"); string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"]; string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"]; string nomeFileOut = nomeFile + estensioneFile; //StreamWriter outFile = new StreamWriter(pathOut + @"\EstrazioneIndirizziCO.txt"); StreamWriter outFile = new StreamWriter(pathOut + @"\" + nomeFileOut); //scrivo il record iniziale outFile.WriteLine("FLUSSOANAGRAFICA" + DateTime.Now.ToString("yyyyMMdd")); //ciclo sulla tabella Anagrafica anagagrafica = new Anagrafica(); foreach (DataRow dr in tabellaIndirizzi.Rows) { anagagrafica.codiceFiscale = Convert.ToString(dr["codiceFiscale"]); anagagrafica.codiceContratto = Convert.ToString(dr["contratto"]); anagagrafica.indirizzo = Convert.ToString(dr["indirizzo"]); anagagrafica.provincia = Convert.ToString(dr["provincia"]); anagagrafica.citta = Convert.ToString(dr["citta"]); anagagrafica.cap = Convert.ToString(dr["cap"]); anagagrafica.presso = Convert.ToString(dr["presso"]); anagagrafica.nazione = Convert.ToString(dr["nazione"]); anagagrafica.email = Convert.ToString(dr["email"]); string riga = anagagrafica.codiceFiscale + anagagrafica.codiceContratto + anagagrafica.indirizzo + anagagrafica.provincia + anagagrafica.citta + anagagrafica.cap + anagagrafica.presso + anagagrafica.nazione + anagagrafica.email; outFile.WriteLine(riga); } outFile.WriteLine("ZZZZZZZZZZZZZZZZ99999999999"); outFile.Close(); Log.ScriviLog("CreaTxt... Fine "); } private DataTable LanciaEstrazioneIndirizzi() { Log.ScriviLog("LanciaEstrazioneIndirizzi... Start "); List parametri = new List(); DataTable tabellaIndirizzi = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[dbo].[Estrazione_Indirizzi_CO]", parametri); Log.ScriviLog(tabellaIndirizzi.Rows.Count + " righe estratte"); Log.ScriviLog("LanciaEstrazioneIndirizzi... Fine "); return tabellaIndirizzi; } private void rinominaFileFtp() { Log.ScriviLog("rinominaFileFtp... Start "); //preso qui: https://social.msdn.microsoft.com/Forums/en-US/8c541130-b571-4b1a-9117-ac610f3e8b34/ftpwebrequestrenameto-property?forum=netfxnetcom string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"]; string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"]; string nomeFileHost = nomeFile + estensioneFile; string FileUri = ConfigurationManager.AppSettings["FTPServerHost"] + nomeFileHost; //string FileUri = "ftp://someftp/somedir/test.tmp"; FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(FileUri); ftp.Method = WebRequestMethods.Ftp.Rename; ftp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FTPUserHost"], ConfigurationManager.AppSettings["FTPPasswordHost"]); //ftp.Credentials = new NetworkCredential(UserName, Password); //Don't include the path string nuovoNomeFile = nomeFile + "_" + DateTime.Now.ToString("yyyyMMdd") + estensioneFile; ftp.RenameTo = nuovoNomeFile; FtpWebResponse r = (FtpWebResponse)ftp.GetResponse(); Log.ScriviLog("rinominaFileFtp... Fine response {0} " + r.StatusDescription); } private void inviaFlussoHostFTP() { Log.ScriviLog("inviaFlussoHostFTP... Start "); string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"]; string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"]; string nomeFileBackup = nomeFile + estensioneFile; //string pathFileBackup = ConfigurationManager.AppSettings["PathFileHostBackup"]; //if (!pathFileBackup.EndsWith("\\")) // pathFileBackup += "\\"; //pathFileBackup += nomeFileBackup; string nomeFileHost = nomeFile + estensioneFile; //StringBuilder flussoHost = new StringBuilder(); //flussoHost.Append(pathFileBackup.ToString() + "\r\n"); string pathFileStream = ConfigurationManager.AppSettings["Application_Folder"] + "\\" + nomeFileHost; Log.ScriviLog("inviaFlussoHostFTP... invio il file" + pathFileStream); StreamReader sourceStream = new StreamReader(pathFileStream); //byte[] flussoInByte = StrToByteArray(flussoHost.ToString()); byte[] flussoInByte = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ConfigurationManager.AppSettings["FTPServerHost"] + nomeFileHost); request.Method = WebRequestMethods.Ftp.UploadFile; request.ContentLength = flussoInByte.Length; request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FTPUserHost"], ConfigurationManager.AppSettings["FTPPasswordHost"]); byte[] buffer = new byte[4096]; using (Stream writer = request.GetRequestStream()) using (MemoryStream ms = new MemoryStream(flussoInByte)) { int bytesRead = 0; int totalBytes = 0; do { bytesRead = ms.Read(buffer, 0, buffer.Length); if (bytesRead > 0) { writer.Write(buffer, 0, bytesRead); totalBytes += bytesRead; } } while (bytesRead > 0); } FtpWebResponse response = (FtpWebResponse)request.GetResponse(); //V //LogFTP(response); // response.Close(); //File.WriteAllBytes(pathFileBackup, flussoInByte); Log.ScriviLog("inviaFlussoHostFTP... Fine, status {0} " + response.StatusDescription); } #endregion //not helping the User tho, just for us } }