none
Lavorare con le cartelle. Parte 1: RRS feed

  • Domanda

  • Ciao a tutti.

    Premessa: Scusate se il titolo non è prorpiamente adeguato, ma ritenevo doveroso inserire quel "Parte 1" poichè le domande sono piu di una, quindi nell'ottica di chi potra trovare utile queste mie domande e in considerazione di mantenere una certa tematicità degli argomenti ho pensato di suddividerle in piu post.

     

    Ok, a parte la "doverosa" premessa, vengo al dunque. Ho creato una pagina dove ogni utente (che si è registrato) potrà crearsi indipendentemente tutte le cartelle che vorrà all'interno della propria "Cartella Utente". Questo il metodo che ho scritto:

        protected void btnFolder_Click(object sender, EventArgs e)
        {
            // Creo le stringhe contenenti il percorso + il nome della cartella (utente)
            string UserFolder = Membership.GetUser().UserName;
            string folderName = txtFolder.Text;
            string path = Server.MapPath(@"~/public/") + UserFolder.ToString() + "/" + folderName;
            
            DirectoryInfo source = new DirectoryInfo(path);
    
            try
            {
                if (source.Exists)
                {
                    lblFolderMessage.Text = "La certella che si sta tentando creare esiste già!";
                }
    
                else
                {
                    source.Create();
                    lblFolderMessage.Text = "Cartella creata correttamente.";
                }
            }
            catch (Exception)
            {
                lblMex.Text = "E' avvenuto un errore durante la creazione della cartella. Un messaggio è stato gia inviato all'amministratore di sistema contenente i dettagli dell'errore. Ci scusiamo per il disagio.";
            }
        }
    
    


    Prima considerazione: Un utente malintenzionato, con il mio metodo può arrecare danno alla mia applicazione? Come ad esempio, poter accedere ad altre cartelle poste al di sopra delle sue? Se si, in che modo si puo evitare una tale situazione?

    Seconda Considerazione: Nella pagina ho inserito una label, che vorrei venisse popolata con il percorso delle sole proprie cartelle (una sorta di briciole di pane) fin'ora l'ho popolata con la cartella principale dell'utente. Inoltre questa label si trova dentro un fieldet, e sempre dentro il fieldset (sotto la label) vorrei mostrare a video un'icona cartella e sotto il rispettivo nome, quelle che ha creato l'utente più i files contenuti in essa. Un po come avviene nelle cartelle di windows per capirci, al click su una cartella questa si apre (aggiorna il fieldset) e mostra il suo contenuto.

    Come inizio credo sia già abbastanza articolato, no? ;-)

    Grazie a tutti voi!


    Ricardo Bagnati - www.vicenzasoftware.com
    sabato 4 febbraio 2012 09:40

Risposte

  • Qualcosa di questo tipo (da inserire subito dopo la tua casella di testo txtFolder):

    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="Inserire il nome della cartella"
            ControlToValidate="txtFolder" SetFocusOnError="true">*</asp:RequiredFieldValidator>
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Nome cartela non valido. Sono ammesse lettere, numeri, spazi e i caratteri - e _"
            ControlToValidate="txtFolder" ValidationExpression="[0-9A-Za-z_\- ]+" SetFocusOnError="true"
            Display="Dynamic">Nome cartela non valido. Sono ammesse lettere, numeri, spazi e i caratteri - e _</asp:RegularExpressionValidator>
    
    

    Ci sono due validatori:

    1. Il RequiredFieldValidator controlla che venga effettivamente inserito qualcosa nella casella;
    2. Il RegularExpressionValidator verifica che la casella contenga solo numeri, lettere, spazi e i caratteri - e _.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu lunedì 13 febbraio 2012 16:37
    • Contrassegnato come risposta Irina Turcu lunedì 20 febbraio 2012 12:14
    domenica 5 febbraio 2012 13:15
    Postatore
  • Devi creare una procedura che, data una certa cartella, va a leggere su disco quali sono i file e le sottocartelle contenute, mostrando tutti gli oggetti a video.

    Diciamo che il cuore del sistema sono i due metodi Directory.GetFiles (http://msdn.microsoft.com/it-it/library/07wt70x2.aspx) e Directory.GetDirectories (http://msdn.microsoft.com/it-it/library/c1sez4sc.aspx). La tematica però è un po' lunga da spiegare. Ti consiglio quindi di dare un'occhiata al codice di uno degli esempi che ti ho indicato in precedenza, ovvero http://www.codeproject.com/Articles/8881/Web-File-Manager, dove puoi trovare tutti gli algoritmi già implementati.

    In questo modo, puoi capire il funzionamento del sistema (hai a disposizione tutto il codice sorgente, quindi hai il controllo totale su ciò che avviene), personalizzandolo secondo le tue esigenze.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu lunedì 13 febbraio 2012 16:39
    • Contrassegnato come risposta Irina Turcu lunedì 20 febbraio 2012 12:15
    domenica 5 febbraio 2012 18:23
    Postatore

Tutte le risposte

  • ciao, bisognerebbe vedere più nello specifico tutto il tuo software, cmq se passa solo da questa funzione qui , io la cosa che farei è che il nome della directory che crea possa passare solo attraverso una regular expression che mi consente di mettere solo i caratteri a-z ad esempio e numeri.

    Se mai non credo che il problema sia fare 1 cartella

    può con qualche stratagemma fare + cartelle ?  questo è da evitare magari non solamente guardando su file system se esiste già ma  a monte controllare su db ad esempio.

    Immagino che poi ci vorrà mettere delle cose dentro questa cartella, ed è qui che farei molta più attenzione.

     

     

    sabato 4 febbraio 2012 13:42
  • ciao, bisognerebbe vedere più nello specifico tutto il tuo software, cmq se passa solo da questa funzione qui , io la cosa che farei è che il nome della directory che crea possa passare solo attraverso una regular expression che mi consente di mettere solo i caratteri a-z ad esempio e numeri.

    Se mai non credo che il problema sia fare 1 cartella

    può con qualche stratagemma fare + cartelle ?  questo è da evitare magari non solamente guardando su file system se esiste già ma  a monte controllare su db ad esempio.

    In realtà puo creare solo una cartella, poi il discorso della regular expression l'avevo preso in considerazione, ma volevo sapere se poteva attaccare lo stesso l'applicazione

    Immagino che poi ci vorrà mettere delle cose dentro questa cartella, ed è qui che farei molta più attenzione.

     

     


    Certo, infatti metterei dei "filtri" che consentano solo certi tipi di file (file di office o immagini). Poi, se ci sono altre particolari accortezze da tenere in considerazione, benvengano!
    Ricardo Bagnati - www.vicenzasoftware.com
    sabato 4 febbraio 2012 15:29
  • Prima considerazione: Un utente malintenzionato, con il mio metodo può arrecare danno alla mia applicazione? Come ad esempio, poter accedere ad altre cartelle poste al di sopra delle sue? Se si, in che modo si puo evitare una tale situazione?

    Il metodo che hai scritto nel tuo codice è molto vulnerabile, perché non fai alcun controllo su quello che viene scritto in txtFolder. Se ad esempio io scrivo ../mia_folder, poiché con .. si indica la cartella di livello superiore, il risultato è che la cartella viene creata non in UserFolder, ma allo stesso livello di public.

    Quindi, ti consiglio di applicare al più presto il controllo tramite Regular Expression, come ti suggeriva Alessandro.

    Se hai bisogno di creare una sorta di File Manager per ASP .NET, in cui ogni utente può gestire file e cartelle remote, puoi dare un'occhiata ai vari progetti che si trovano sulla rete. Spesso si tratta di componenti già pronti che puoi prendere e inserire nella tua applicazione (agendo sulle proprietà messe a disposizione per personalizzarli).

    Ti lascio i link ad alcune risorse interessanti:

    Mi raccomando, se decidi di adottarli, controlla le licenze d'uso dei componenti, perché alcuni potrebbero non essere free per scopi commerciali.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 4 febbraio 2012 17:55
    Postatore
  • Ciao Marco, ho provato uno degli esempi, ma credo sia meglio crearmi da solo il mio file manager. Per due motivi:

    1. Posso avere il controllo al 100% di dove, come e quando creare o salvare i files (e nel mio caso devo dare uno spazio ad ogni utente, e ogni utente puo visionare solo il proprio). Ciò non toglie che posso sempre attingere al loro codice per vedere come hanno fatto questo o quello, naturalmente.
    2. Imparo l'utilizzo del System.IO

    I tuoi link ad ogni modo risultano interessanti, per eventuali progetti che non necessitino di associare lo spazio/utente, e come fonte "d'ispirazione".

     

    Per quanto riguarda le Regex per impedire l'accesso al livello superiore della root sto provando (e cercando) qual'è la stringa giusta. Se uso ad esempio:

    string folderName = Regex.Replace(txtFolder.Text, "[a-zA-z]", String.Empty);
    


    Mi ritrovo con una stringa vuota (in pratica è come se dicessi di togliere tutte le lettere con lo string.Empty) quindi sto cercando la regular expression per i simboli...


    Ricardo Bagnati - www.vicenzasoftware.com
    domenica 5 febbraio 2012 08:53
  • potrebbe essere che il nome della cartella coincida con il nome dell'utente, controllando prima che gli utenti possano avere nomi idonei.

     

    Altrimenti piuttosto che replace, meglio un regularexpressionvalidator quando l'utente sceglie il nome della sua cartella.

    Altrimenti ancora valida con il metodo match, ma avverti l'utente se vuole fare il furbetto, non fare un replace e praticamente l'utente non si accorge di nulla.

     

    domenica 5 febbraio 2012 10:04
  • Qualcosa di questo tipo (da inserire subito dopo la tua casella di testo txtFolder):

    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="Inserire il nome della cartella"
            ControlToValidate="txtFolder" SetFocusOnError="true">*</asp:RequiredFieldValidator>
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Nome cartela non valido. Sono ammesse lettere, numeri, spazi e i caratteri - e _"
            ControlToValidate="txtFolder" ValidationExpression="[0-9A-Za-z_\- ]+" SetFocusOnError="true"
            Display="Dynamic">Nome cartela non valido. Sono ammesse lettere, numeri, spazi e i caratteri - e _</asp:RegularExpressionValidator>
    
    

    Ci sono due validatori:

    1. Il RequiredFieldValidator controlla che venga effettivamente inserito qualcosa nella casella;
    2. Il RegularExpressionValidator verifica che la casella contenga solo numeri, lettere, spazi e i caratteri - e _.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu lunedì 13 febbraio 2012 16:37
    • Contrassegnato come risposta Irina Turcu lunedì 20 febbraio 2012 12:14
    domenica 5 febbraio 2012 13:15
    Postatore
  • Grazie Marco, infatto cosi come mi hai indicato tu, ho risolto. Adesso, passando alla seconda questione

    Seconda Considerazione: Nella pagina ho inserito una label, che vorrei venisse popolata con il percorso delle sole proprie cartelle (una sorta di briciole di pane) fin'ora l'ho popolata con la cartella principale dell'utente. Inoltre questa label si trova dentro un fieldet, e sempre dentro il fieldset (sotto la label) vorrei mostrare a video un'icona cartella e sotto il rispettivo nome, quelle che ha creato l'utente più i files contenuti in essa. Un po come avviene nelle cartelle di windows per capirci, al click su una cartella questa si apre (aggiorna il fieldset) e mostra il suo contenuto.

     

    In che modo potrei risolvere? Grazie...


    Ricardo Bagnati - www.vicenzasoftware.com
    domenica 5 febbraio 2012 18:03
  • Devi creare una procedura che, data una certa cartella, va a leggere su disco quali sono i file e le sottocartelle contenute, mostrando tutti gli oggetti a video.

    Diciamo che il cuore del sistema sono i due metodi Directory.GetFiles (http://msdn.microsoft.com/it-it/library/07wt70x2.aspx) e Directory.GetDirectories (http://msdn.microsoft.com/it-it/library/c1sez4sc.aspx). La tematica però è un po' lunga da spiegare. Ti consiglio quindi di dare un'occhiata al codice di uno degli esempi che ti ho indicato in precedenza, ovvero http://www.codeproject.com/Articles/8881/Web-File-Manager, dove puoi trovare tutti gli algoritmi già implementati.

    In questo modo, puoi capire il funzionamento del sistema (hai a disposizione tutto il codice sorgente, quindi hai il controllo totale su ciò che avviene), personalizzandolo secondo le tue esigenze.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu lunedì 13 febbraio 2012 16:39
    • Contrassegnato come risposta Irina Turcu lunedì 20 febbraio 2012 12:15
    domenica 5 febbraio 2012 18:23
    Postatore
  • Ok, prendero di esempio... l'esempio!

    Intanto grazie...


    Ricardo Bagnati - www.vicenzasoftware.com
    domenica 5 febbraio 2012 18:35
  • OK, tienici informati sugli sviluppi!

    Aggiungo solo una cosa: l'esempio che ti ho menzionato è in VB .NET, ma se vuoi convertirlo in C#, puoi usare un converter online, come quello che trovi qui: http://www.developerfusion.com/tools/convert/vb-to-csharp/.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    domenica 5 febbraio 2012 18:59
    Postatore