5 messaggi dal 22 febbraio 2016
Ciao a tutti,
premessa necessaria. Prima di tutto grazie per il tempo che impiegate a leggere queste mie righe e, nel caso, la gentilezza a commentare. Seconda cosa,
sono un neofita e sto imparando per la prima volta in questi giorni il linguaggio .NET; abbiate pietà..infatti, in parte mi dà soddisfazioni ma in parte mi sto tipo torturando per capire come funzionano delle cose.

Vi volevo chiedere un aiuto.
Devo creare in pratica una classe che scarichi dei file da un sito a una cartella del pc. Per non saper nè leggere nè scrivere ho cercato online, e ho trovato che il metodo WebClient dovrebbe attuare questa procedura, mi confermate? Qualcuno utilizza altri metodi più efficienti?

Grazie e scusatemi se ho scritto banalità/errori/orrori
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao e benvenuto,
specifica che tipo di applicazione stai costruendo, dato che il .NET framework è un linguaggio ambiente adatto per scrivere applicazioni web, desktop, mobile e per dispositivi IoT.

Per esempio, si tratta di un'applicazione web ASP.NET? Oppure di un'applicazione windows costruita con Winforms o WPF?
Modificato da BrightSoul il 16 luglio 2016 14.06 -

Enjoy learning and just keep making
5 messaggi dal 22 febbraio 2016
Ciao, grazie mille per la risposta e la gentilezza.
E' una applicazione con Windows costruita con WPF.
Modificato da lukebrunel il 17 luglio 2016 10.55 -
Modificato da lukebrunel il 17 luglio 2016 10.55 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego!


WPF

Benissimo, allora puoi usare il metodo DownloadFile della classe WebClient, come avevi intuito. Ecco qui la documentazione su MSDN:
https://msdn.microsoft.com/it-it/library/ez801hhe(v=vs.110).aspx
Lì in basso trovi un esempio che certamente funziona anche se è un po' incasinato. Te ne riporto uno più semplice.

var percorsoLocale = @"C:\Cartella\NomeFile.ext";
var urlFile = @"http://www.dominio.com/nomefile.ext";
using (var myWebClient = new WebClient()){
  myWebClient.DownloadFile(urlFile, percorsoLocale);
}


Il percorso in cui salvare il file puoi anche farlo scegliere all'utente (se vuoi che sia così) usando la SaveFileDialog.
http://www.wpf-tutorial.com/dialogs/the-savefiledialog/

Ora c'è una considerazione importante da fare: il metodo DownloadFile è bloccante. Significa che, per tutta la durata del download, l'interfaccia grafica risulterà irresponsiva ai click e alle altre azioni dell'utente. Per risolverlo dovrai usare l'alternativa asincrona del metodo DownloadFile. Quale versione del .NET Framework stai usando? 4 o 4.5 o superiore? Lo vedi dalle proprietà del progetto.

ciao,
Moreno
Modificato da BrightSoul il 17 luglio 2016 11.21 -

Enjoy learning and just keep making
5 messaggi dal 22 febbraio 2016
Allora, dovrei avere la versione 4.5!
Grazie mille Moreno, non conoscevo la SaveFileDialog! E' davvero utilissima!
Però, quando scelgo il percorso su cui salvare il file, come faccio a copiare e incollare il path su 'percorso locale'?
Cioè, una volta che per esempio, dopo un evento click che mi chiederà il path, avrò scelto la directory X, come faccio a fargli dire "ora scaricami il file sulla directory X scelta?'. Perchè mantenendo queste righe di codice così

var percorsoLocale = @"C:\Cartella\NomeFile.ext";
var urlFile = @"http://www.dominio.com/nomefile.ext";
using (var myWebClient = new WebClient()){
myWebClient.DownloadFile(urlFile, percorsoLocale);
}

il file sarà scaricato su un percorso già indicato, che qui per esempio è C:\Cartella\NomeFile.ext (che non è quello che si vuole).

Spero di essermi spiegato, anzi sicuramente avrò scritto castronate, perdonami già da adesso.
Grazie Luca
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Luca,
il percorso del file lo puoi ottenere dalla proprietà FileName della SaveFileDialog. Nell'articolo era presente un esempio di codice; ecco la parte "importante":
if(saveFileDialog.ShowDialog() == true)
   File.WriteAllText(saveFileDialog.FileName, txtEditor.Text);


Quindi nel tuo caso diventa:
SaveFileDialog saveFileDialog = new SaveFileDialog();
if(saveFileDialog.ShowDialog()){
  var urlFile = @"http://www.dominio.com/nomefile.ext";
  using (var myWebClient = new WebClient()){
    myWebClient.DownloadFile(urlFile, saveFileDialog.FileName);
  }
}


L'if serve a verificare che l'utente abbia cliccato OK e non Annulla sulla finestra di dialogo.
Il download avviene dunque solo se l'utente ha cliccato OK.

ciao,
Moreno

Enjoy learning and just keep making
5 messaggi dal 22 febbraio 2016
Grazie Moreno,
sei così chiaro che vorrei seguire un corso tenuto da te...
E davvero gentilissimo.
Comunque, credo di essermi imbattuto nel sistema bloccante che dicevi, e credo di aver trovato la funzione async che dicevi.
Ho scritto queste linee che vengono compilate e non mi danno problemi...solo che non scarica. (il sito l'ho scelto assolutamente a caso).
Solo che non trovo errori, perchè non ne dà nemmeno Visual Studio

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load_1(object sender, EventArgs e)
        {
            WebClient client = new WebClient();
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
            client.DownloadFileAsync(new Uri("http://modellodelega.com/wp-content/plugins/download-attachments/includes/download.php?id=23.exe"), @"C:\Users\Luca\Documents\A scuola con VB 2010\Applicazioni\Anagrafe alunni");
        }

       


        
        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar2.Maximum = (int)e.TotalBytesToReceive / 100;
            progressBar2.Value = (int)e.BytesReceived / 100;
        }
        private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Dowload completed!");
        }

       
    }
}
5 messaggi dal 22 febbraio 2016
ho capito l'errore!
dovevo metter eil file e non la directory!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.