public void Visit(Cartella cartella)
 {
     if (cartella.Children.Count > 0)
     {
         //Creo la stringa del path da ricreare
         string dirname   = new DirectoryInfo(cartella.Path).Name;
         string dirToSync = String.Join("\\", _pathDestinazione, dirname);
         //Creo la cartella richiesta se non esiste
         if (!Directory.Exists(dirToSync))
         {
             Directory.CreateDirectory(dirToSync);
             ActionCompletedEvent args = new ActionCompletedEvent
             {
                 ToEntry = EntryFactory.CreateEntry(this, "creata cartella",
                                                    sorgente: cartella.Path, destinazione: dirToSync)
             };
             ToLog?.Invoke(this, args);
         }
         //Memorizzo il vecchio path per quando ho finito di ispezionare i figli
         string oldPath = _pathDestinazione;
         //Il nuovo path è quello di questa cartella
         _pathDestinazione = dirToSync;
         //Entro e sincronizzo le sottocartelle usando il nuovo path
         foreach (FilesystemElement element in cartella.Children)
         {
             element.Accept(this);
         }
         //Ripristino il path vecchio =>(..)
         _pathDestinazione = oldPath;
     }
 }
        public void Visit(FileWrapper file)
        {
            FileInfo source      = new FileInfo(file.Path);
            String   fileDstPath = String.Join("\\", _pathDestinazione, source.Name);

            //Trovo l'autore del file
            string author = File.GetAccessControl(file.Path).GetOwner(typeof(System.Security.Principal.NTAccount)).ToString();

            //Prova va spostato sotto

            if (!author.Equals(string.Join("\\", Utente.GetNomeHost(), Utente.GetNomeUtente())))
            {
                if (!_blacklistController.IsBlackListed(author))
                {
                    bool riconosciuto = _viewHome.ChiediScelta(author);
                    if (riconosciuto)
                    {
                        //Se esiste Confronto gli hash se sono diversi sincronizzo
                        if (File.Exists(fileDstPath))
                        {
                            var    sourceStream = new FileStream(file.Path, FileMode.Open, FileAccess.Read);
                            String srcSum       = GetChecksumBuffered(sourceStream);
                            var    dstStream    = new FileStream(fileDstPath, FileMode.Open, FileAccess.Read);
                            String dstSum       = GetChecksumBuffered(dstStream);

                            //Se gli hash non sono uguali
                            if (!srcSum.Equals(dstSum))
                            {
                                File.Copy(file.Path, fileDstPath);
                                ActionCompletedEvent args = new ActionCompletedEvent
                                {
                                    ToEntry = EntryFactory.CreateEntry(this, "file copiato", sorgente: file.Path, destinazione: fileDstPath)
                                };
                                ToLog?.Invoke(this, args);
                            }
                        }
                        //Copio diretto
                        else
                        {
                            File.Copy(file.Path, fileDstPath);
                            ActionCompletedEvent args = new ActionCompletedEvent
                            {
                                ToEntry = EntryFactory.CreateEntry(this, "file copiato", sorgente: file.Path, destinazione: fileDstPath)
                            };
                            ToLog?.Invoke(this, args);
                        }
                    }
                    else
                    {
                        _blacklistController.AggiungiUtente(author);
                        //Elimino il file
                        File.Delete(file.Path);
                        ActionCompletedEvent args = new ActionCompletedEvent
                        {
                            ToEntry = EntryFactory.CreateEntry(this, "file eliminato", sorgente: file.Path)
                        };
                        ToLog?.Invoke(this, args);
                    }
                }
            }
            //Il file è del proprietario non c'è bisogno di chiamare la blacklist
            else
            {
                if (File.Exists(fileDstPath))
                {
                    var    sourceStream = new FileStream(file.Path, FileMode.Open, FileAccess.Read);
                    String srcSum       = GetChecksumBuffered(sourceStream);
                    var    dstStream    = new FileStream(fileDstPath, FileMode.Open, FileAccess.Read);
                    String dstSum       = GetChecksumBuffered(dstStream);

                    //Se gli hash non sono uguali
                    if (!srcSum.Equals(dstSum))
                    {
                        ActionCompletedEvent args = new ActionCompletedEvent
                        {
                            ToEntry = EntryFactory.CreateEntry(this, "file copiato", sorgente: file.Path, destinazione: fileDstPath)
                        };
                        ToLog?.Invoke(this, args);
                        File.Copy(file.Path, fileDstPath);
                    }
                }
                //Copio diretto
                else
                {
                    ActionCompletedEvent args = new ActionCompletedEvent
                    {
                        ToEntry = EntryFactory.CreateEntry(this, "file copiato", sorgente: file.Path, destinazione: fileDstPath)
                    };
                    ToLog?.Invoke(this, args);
                    File.Copy(file.Path, fileDstPath);
                }
            }
        }