Beispiel #1
0
        public void Retrieve()
        {
            char[]      stringBuffer = new char[4096];
            byte[]      buffer       = new byte[4096];
            int         total        = 0;
            int         count        = 0;
            FileStream  file         = null;
            TcpListener dataListener = null;
            string      filePath     = null;
            bool        ricevuto     = false;
            bool        isText;

            isDir = false;
            bool yes = false;

            try
            {
                if (dataConnection != null)
                {
                    if (dataConnection.Connected)
                    {
                        bool answer = rif.ShowOptions();
                        if (answer == true)
                        {
                            yes = true;
                            rif_ser.fineTrasferimento();
                            throw new Exception();
                        }
                        return;
                    }
                }

                dataConnection = null;


                dataListener = new TcpListener(IPAddress.Any, port);
                dataListener.Start();

                streamWriter.WriteLine("retr");
                streamWriter.Flush();

                dataConnection = dataListener.AcceptTcpClient();
                dataListener.Stop();

                //Console.WriteLine("Connessione dati stabilita! " + dataConnection.Client.LocalEndPoint.ToString());
                NetworkStream dataNetworkStream = dataConnection.GetStream();
                StreamReader  dataStreamR       = new StreamReader(dataNetworkStream);
                StreamWriter  dataStreamW       = new StreamWriter(dataNetworkStream);

                string fileName = dataStreamR.ReadLine(); //legge il messaggio mandato dal server
                string text     = null;

                string[] sizeArray = fileName.Split('!');
                long     size      = Convert.ToInt64(sizeArray[0]);
                fileName = sizeArray[1];

                if (fileName.Equals("Text"))
                {
                    //File.Open("tmpStringFile.txt", FileMode.Create);
                    isText = true;
                    if (dataNetworkStream.CanWrite)
                    {
                        dataStreamW.WriteLine("go");
                        dataStreamW.Flush();
                    }
                    using (StreamReader reader = new StreamReader(dataNetworkStream))
                    {
                        //using (StreamWriter writer = new StreamWriter(File.Open("tmpStringFile.txt", FileMode.Create)))
                        //{
                        //    while ((count = reader.Read(stringBuffer, 0, stringBuffer.Length)) > 0)
                        //    {
                        //        writer.Write(stringBuffer, 0, count);
                        //        total += count;
                        //    }
                        //}
                        text = reader.ReadToEnd();

                        if (text.Length != size) //plain text corrotto
                        {
                            throw new Exception();
                        }
                    }
                }
                else
                {
                    isText = false;
                    string[] fileNameArray  = fileName.Split(';'); //; inviato solo nel caso di directory
                    string[] fileNameArray1 = null;                //utilizzato per tirare fuori il nome della directory (in ricez ho nomeDir.zip)

                    if (fileNameArray.Length == 2)
                    {
                        isDir          = true;
                        fileName       = fileNameArray[1]; //stacco dal fileName ricevuto il "dir;"
                        fileNameArray1 = fileName.Split('.');
                    }

                    if (dataNetworkStream.CanWrite)
                    {
                        dataStreamW.WriteLine("go");
                        dataStreamW.Flush();
                    }
                    if (!Directory.Exists("C:\\temp"))
                    {
                        Directory.CreateDirectory("C:\\temp");
                    }
                    filePath = "C:\\temp\\" + fileName; //path al file di destinazione in temp (file o cartella comp)
                    if (File.Exists(filePath))
                    {
                        File.Delete(filePath);
                    }
                    file = File.Create(filePath);

                    //fase di lettura indipendente dal tipo di file (i direttori sono letti e memorizzati come files compressi)
                    using (BinaryReader bReader = new BinaryReader(dataNetworkStream))
                    {
                        using (BinaryWriter bWriter = new BinaryWriter(file))
                        {
                            set = false;
                            rif_ser.inCorso(set);
                            while ((count = bReader.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                bWriter.Write(buffer, 0, count);
                                total += count;
                            }
                        }
                    }
                    rif_ser.fineTrasferimento();
                    file.Close();
                    FileInfo fInfo = new FileInfo(filePath);
                    if (fInfo.Length != size)
                    {
                        throw new Exception(); //file corrotto
                    }
                    if (isDir)
                    {
                        string nome_dir = null;
                        for (int i = 0; i < fileNameArray1.Length - 1; i++)
                        {
                            if (nome_dir == null)
                            {
                                nome_dir = nome_dir + fileNameArray1[i];
                                continue;
                            }
                            nome_dir = nome_dir + "." + fileNameArray1[i];
                        }

                        using (ZipFile zip = ZipFile.Read(filePath))
                        {
                            if (Directory.Exists("C:\\temp\\" + nome_dir))
                            {
                                DeleteDirectory("C:\\temp\\" + nome_dir);
                            }
                            Directory.CreateDirectory("C:\\temp\\" + nome_dir);
                            foreach (ZipEntry e in zip)
                            {
                                e.Extract("C:\\temp\\" + nome_dir);
                            }
                        }
                        if (File.Exists(filePath)) //elimino il file compresso ricevuto, ora ho la cartella decompressa
                        {
                            File.Delete(filePath);
                        }
                        filePath = "C:\\temp\\" + fileNameArray1[0]; //imposto il nome del path alla cartella decompressa
                    }
                    //Console.WriteLine("File ricevuto!");
                    ricevuto = true;
                }
                dataStreamR.Close();
                dataConnection.Close(); //connessione dati abbattuta dopo ogni trasferimento

                if (isText)
                {
                    rif.SetClipText(text);
                }
                else
                {
                    StringCollection s = new StringCollection();
                    s.Add(filePath);
                    rif.SetClip(s);
                }
            }
            catch (Exception)
            {
                if (file != null)
                {
                    file.Close();
                }
                if (ricevuto == false && yes == true)
                { //per il plain text non devo fare niente, al rientro dalla funzione la stringa corrotta e' eliminata senza essere copiata nella clipboard
                    if (File.Exists(filePath))
                    {
                        File.Delete(filePath);
                        rif.DisplayErrorMessage();
                    }
                }
                if (dataListener != null)
                {
                    dataListener.Stop();
                }
                if (dataConnection != null)
                {
                    if (dataConnection.Connected)
                    {
                        dataConnection.Close();
                    }
                }
                //Disconnetti(); //meglio di no, un problema sulla connessione dati non deve implicare un problema sul canale di ctrl
            }
        }