none
Ricavare percorso da una listbox RRS feed

  • Domanda

  • Salve a tutti ho un problema, io vorrei che appena trascino un file su una listbox e clicco su un button mi scriva il percorso del file che ho trascinato nella listbox. Ho fatto tutto pero non so come ricavare il percorso del file inserito nella listbox. Ah dimenticavo il percorso deve essere scritto in un file txt, per questo non ce problemi lo so fare ma non so ricavarne il percorso perche non voglio il percorso di un file specifico ma di ogni file che inserisco nella listbox. Spero di essermi spiegato bene grazie in anticipo.
    domenica 22 maggio 2011 18:58

Risposte

  • E' nella stessa directory però non ho capito che intendi per controlla che sia in un percorso di path. Puoi spiegarmi? Grazie in anticipo


    Ciao Andrea,

    prova a modificare la tua stinga di comando in

     

    Process.Start("C:\mytest\myprogram\m2.exe " + filenpc + " npc.xml");

    Naturalmente sostituisci C:\mytest\myprogram\ 

    con il percorso dove sta il tuo file m2.exe


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    martedì 24 maggio 2011 14:19
  • Ecco ho messo questa stringa al posto di quella di prima
    Process.Start(@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\m2.exe" + filenpc + "npc.xml");
    però mi dice impossibile trovare il file specificato cioè come prima uguale identico ma me lo dice al file npc.xml Mi mette una specie di freccia sul nome npc.xml cioè in tutta la stringa di comanda me lo dice al nome "npc.xml" come se non trova quel file. Grazie in anticipo della prossima risposta


    Ciao Andrea,

    scusami ma leggendo con il portatile non avevo notatop una cosa ... non hai separato il nome del file da eseguire dagli argomenti che passi a questo file

    quindi la tua riga  deve diventare

     

    Process.Start(@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\m2.exe",  filenpc + " npc.xml");

    personamelte trovo però più chiara la scrittura del codice in questo modo

     

     

     static void OpenMyProg(string f)
     {
    	 ProcessStartInfo startInfo = new ProcessStartInfo();
    	 startInfo.FileName = "M2.EXE";
    	 startInfo.Arguments = f;
    	 Process.Start(startInfo);
     }
    
    

     

    Ciao

     

    PS la tua domanda però è orami sconfinata in un argomento diverso da quello oggetto della tua domanda iniziale ... sarebbe meglio, se hai ancora necessità, creare un nuovo thread

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato



    martedì 24 maggio 2011 19:50

Tutte le risposte

  • Inanzitutto grazie della risposta Matteo! Poi volevo dirti che già ho seguito quella guida per far si di poter trascinare file nella listbox. Però a me interessa poter ricavare il percorso di quel file che ho inserito nella listbox, e non ho idea di come poter fare... Spero mi aiuti o mi aiutiate!
    lunedì 23 maggio 2011 08:08
  • Ciao Andrea1980345,

    con riferimento al codice che ti ha indicato Matteo puoi estrarre il pathname utilizzando la classe FileInfo applicata all'elemento aggiunto alla ListBox

     

      Private Sub ListBox1_DragDrop(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.DragEventArgs) _
                    Handles ListBox1.DragDrop
        Dim s() As String = e.Data.GetData("FileDrop", False)
        Dim i As Integer
    
    
    
        For i = 0 To s.Length - 1
          ListBox1.Items.Add(s(i))
        Next i
    
        Dim fiTemp As New System.IO.FileInfo(ListBox1.Items(ListBox1.Items.Count - 1))
        MessageBox.Show(fiTemp.FullName)
        MessageBox.Show(fiTemp.DirectoryName)
        MessageBox.Show(fiTemp.Name)
        MessageBox.Show(fiTemp.Extension)
    
      End Sub
    

     

    Ciao

     

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    lunedì 23 maggio 2011 08:34
  • Forse voglio fare qualcosa al id sopra delle mie capacità ancora. Non capisco come fare. Renato tu mi hai scritto un codice ma in vb.net se non sbaglio. Grazie comunque della risposta ma continuo a non capire come fare.
    lunedì 23 maggio 2011 08:47
  • Come sempre esistono i code converters e poi sono poche righe facili da tradurre :) :
    http://tangiblesoftwaresolutions.com/Product_Details/Instant_CSharp.html

    Quello che devi fare è:
    1. impostare a true la proprietà AllowDrop della ListBox
    2. intercettare l'evento DragEnter della ListBox e abilitare il drag and drop a seconda del tipo di risorsa che viene trascinata
    3. ottenere la lista dei nomi di file che sono stati trascinati nel controllo

    Attenzione: per un motivo su cui non ho indagato se avvii l'applicazione in modalità Administrator (cosa che avviene anche se avvi VS2010 in tale modalità)
    il controllo non ammette (incona di "divieto") di trascinare all'interno i file. Quindi per verificare il funzionamento o la avvii non in debug da Windows Explorer o fai partire VS2010 in modalità standard user.

    Qui il codice in C#:
    private void ListBox1DragDrop(object sender, DragEventArgs e)
    {
      var files = e.Data.GetData(DataFormats.FileDrop, false) as IEnumerable<string>;
    
      listBox1.DataSource = files;
    }
    
    private void ListBox1DragEnter(object sender, DragEventArgs e)
    {
      if (e.Data.GetDataPresent(DataFormats.FileDrop))
      {
        e.Effect = DragDropEffects.All;
      }
      else
      {
        e.Effect = DragDropEffects.None;
      }
    }
    

    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    lunedì 23 maggio 2011 10:30
  • Ciao Andrea1980345,

    scusa per il codice VB anzichè c# ma mi ha tratto in inganno l'esempio da cui eri partito.

    Come ti indicava Matteo ci sono sempre e comunque i convertitori che tornano comodi in questi casi.

     

    Per ovviare al problema indicato da Matteo nel suo esempio puoi modificare il suo codice in questo modo :

     private void ListBox1_DragDrop(object sender, DragEventArgs e)
        {
          string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    
          foreach (string file in files)
            {
              System.IO.FileInfo fiTemp = new System.IO.FileInfo(file);
              MessageBox.Show(fiTemp.FullName);
              MessageBox.Show(fiTemp.DirectoryName);
              MessageBox.Show(fiTemp.Name);
              MessageBox.Show(fiTemp.Extension);
    
    
    
            listBox1.Items.Add (file);
            }
        }
    
     
    
        private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
          if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
          {
            e.Effect = DragDropEffects.All;
          }
          else
          {
            e.Effect = DragDropEffects.None;
          }
        }
    

     

     Per estrarre ila PathName del/dei file/files inserito/i basta che fai riferimento a queste righe di codice che ho aggiunto :

    System.IO.FileInfo fiTemp = new System.IO.FileInfo(file);
    MessageBox.Show(fiTemp.DirectoryName);
    
    

     in  fiTemp.DirectoryName che io visualizzo in una MessageBox solo per farti vedere il risultato hai il percorso del file aggiunto.

    Ciao

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    lunedì 23 maggio 2011 11:10
  • Grazie mille matteo!
    lunedì 23 maggio 2011 11:29
  • Ok Grazie anche a te Renato grazie a tutti e 2 però adesso se per esempio voglio far scrivere questo percorso ottenuto in un file txt come faccio? Perche se metto

    file.WriteLine("<Action type=\"extract\"" + " archivePath=\"" + ContenitoreFile)
    
    mi scrive questo nel file txt 
    <Action type="extract" archivePath="System.Windows.Forms.ListBox, Items.Count: 1, Items[0]: C:\Users\Andrea\Documents\Visual Studio
    invece nel file txt ho inserito un file di nome NPC e come vedete nel percorso non lo ha scritto e prima del percorso ha scritto altre cose che non doveva scrivere. Comunque oltre a questo problema per far aprire un file da un'altro file come faccio? E' sempre per questo problema, cioè vorrei che appena clicco su un button mi apra il file npc.epk tramite un file chiamato m2.exe. Spero mi rispondiate a tutte e due le domanda perche ne ho davvero bisogno, grazie a tutti!

    lunedì 23 maggio 2011 11:47
  • Ciao Andrea,

    per aprire un deteminato file alla pressione di un CommandButton puoi scrivere un codice tipo questo :

    private void button1_Click(object sender, EventArgs e)
        {
    
      	  OpenMyProg(@"C:\Users\Andrea\Documents\Visual Studio\npc.epk");
        }
    
        static void OpenMyProg(string f)
        {
    	  ProcessStartInfo startInfo = new ProcessStartInfo();
    	  startInfo.FileName = "M2.EXE";
    	  startInfo.Arguments = f;
    	  Process.Start(startInfo);
        }
    

     

    per il problema di scrittura sul file probabilmente la tua variabile ContenitoreFile contiene il valore sbagliato ma così a distenza è difficile dirti cosa c'è di sbagliato.

    se hai bilogno delPathName + Nome File  rispetto al mio esempio precedente basta che vai a scrivere la variabile file

     

    Ciao

     

     

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    lunedì 23 maggio 2011 13:36
  • Ciao Renato e con questo codice che mi hai messo mi apre il file npc.epk tramite il filem2.exe? Cioè a me serve che il file npc.epk venga aperto dal file m2.exe.
    lunedì 23 maggio 2011 15:15
  • Allora Renato ti posto il code e ti spiego un po la situazione, spero potrai aiutarmi.

      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          this.ContenitoreFile.DragDrop += new
          System.Windows.Forms.DragEventHandler(this.ContenitoreFile_DragDrop);
          this.ContenitoreFile.DragEnter += new
                System.Windows.Forms.DragEventHandler(this.ContenitoreFile_DragEnter);
    
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        private void ContenitoreFile_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
          if (e.Data.GetDataPresent(DataFormats.FileDrop))
            e.Effect = DragDropEffects.All;
          else
            e.Effect = DragDropEffects.None;
        }
        private void ContenitoreFile_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
          string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
          int i;
          for (i = 0; i < s.Length; i++)
            ContenitoreFile.Items.Add(s[i]);
             string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    
             foreach (string file in files) ;
    
        }
    
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          StreamWriter sw = new StreamWriter(Application.StartupPath + "npc.xml");
          using (System.IO.StreamWriter file = new System.IO.StreamWriter(Application.StartupPath + "\\npc.xml", true))
            file.WriteLine("<Buildfile version=\"1.1\">" + Environment.NewLine + "<Action type=\"extract\"" + " archivePath=\"" + Application.StartupPath + "\"" + " outputPath =\"Files\"" + " extractAll =\"doSo\"" + " createXML =\"something\"" + " xmlPath =\"npcrecript.xml\" />" + Environment.NewLine + "</BuildFile>");
          System.IO.Directory.CreateDirectory(System.String.Format("Files"));
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
          string filenpc = (@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\NPC.epk");
          Process.Start("m2.exe" + filenpc + "npc.xml");
    
        }
      }
    }
    
    Praticamente come vedi ho due button, uno per creare il file xml con i vari percorsi output ecc dentro e l'altro per decompilare, il file che decompila è il file m2.exe che non ho fatto io ma gente competente. Quindi io vorrei che questo file abbinato al file npc.xml apra il file NPC.epk, praticamente il file m2 funziona solo se ce il file xml con varie righe di codice dentro. Quindi ho messo Process.Start("m2.exe" + filenpc + "npc.xml") come vedi filenpc è una variabile che fa riferimento al file npc.epk E tu starai pensando "E allora che problema ce scusa?" il problema è che ora mi da un'altro errore, cioè questo.
    Win32Exception non è stata gestita
    Unknown error (0x80041002)

    Ho provato anche a creare una variabile string per il file m2.exe ma niente da sempre un errore Win32, diverso ma da sempre errore! Spero potrai aiutarmi, o anche qualcun'altro.

    Grazie in anticipo, Saluti Andrea

    lunedì 23 maggio 2011 16:40
  • Ciao Andrea,
     
    quando scrivi
    Process.Start("m2.exe" + filenpc + "npc.xml");
    
     
    è come se tentassi di mandare in esecuzione un comando del tipo
    m2.exeC:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\NPC.epknpc.xml
    aggiungi uno spazio DOPO m2.exe ed uno prima di npc.xml
    Process.Start("m2.exe " + filenpc + " npc.xml");
    
    Ciao
     
     

    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    martedì 24 maggio 2011 11:22
  • Ciao Renato grazie della risposta adesso mi da questo errore
    Win32Exception non è stata gestita
    Impossibile trovare il file specificato
    eppure i percorsi sono giusti ma mi da questo errore. Sai come posso risolvere? Grazie in anticipo di nuovo
    martedì 24 maggio 2011 12:30
  • Ciao Renato grazie della risposta adesso mi da questo errore
    Win32Exception non è stata gestita
    Impossibile trovare il file specificato
    eppure i percorsi sono giusti ma mi da questo errore. Sai come posso risolvere? Grazie in anticipo di nuovo


    Ciao Andrea,

    vuol dire che il file N2.exe non è accessibile controlal che sia in un percorso di Path oppure che sia nella stessa directory di esecuzione del tuo programma.

     

    Ciao

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    martedì 24 maggio 2011 13:47
  • E' nella stessa directory però non ho capito che intendi per controlla che sia in un percorso di path. Puoi spiegarmi? Grazie in anticipo
    martedì 24 maggio 2011 13:54
  • E' nella stessa directory però non ho capito che intendi per controlla che sia in un percorso di path. Puoi spiegarmi? Grazie in anticipo


    Ciao Andrea,

    prova a modificare la tua stinga di comando in

     

    Process.Start("C:\mytest\myprogram\m2.exe " + filenpc + " npc.xml");

    Naturalmente sostituisci C:\mytest\myprogram\ 

    con il percorso dove sta il tuo file m2.exe


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    martedì 24 maggio 2011 14:19
  • Ecco ho messo questa stringa al posto di quella di prima
    Process.Start(@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\m2.exe" + filenpc + "npc.xml");
    però mi dice impossibile trovare il file specificato cioè come prima uguale identico ma me lo dice al file npc.xml Mi mette una specie di freccia sul nome npc.xml cioè in tutta la stringa di comanda me lo dice al nome "npc.xml" come se non trova quel file. Grazie in anticipo della prossima risposta
    martedì 24 maggio 2011 14:29
  • Ecco ho messo questa stringa al posto di quella di prima
    Process.Start(@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\m2.exe" + filenpc + "npc.xml");
    però mi dice impossibile trovare il file specificato cioè come prima uguale identico ma me lo dice al file npc.xml Mi mette una specie di freccia sul nome npc.xml cioè in tutta la stringa di comanda me lo dice al nome "npc.xml" come se non trova quel file. Grazie in anticipo della prossima risposta


    Ciao Andrea,

    scusami ma leggendo con il portatile non avevo notatop una cosa ... non hai separato il nome del file da eseguire dagli argomenti che passi a questo file

    quindi la tua riga  deve diventare

     

    Process.Start(@"C:\Users\Andrea\Documents\Visual Studio 2010\Projects\decriptatore\decriptatore\bin\Debug\m2.exe",  filenpc + " npc.xml");

    personamelte trovo però più chiara la scrittura del codice in questo modo

     

     

     static void OpenMyProg(string f)
     {
    	 ProcessStartInfo startInfo = new ProcessStartInfo();
    	 startInfo.FileName = "M2.EXE";
    	 startInfo.Arguments = f;
    	 Process.Start(startInfo);
     }
    
    

     

    Ciao

     

    PS la tua domanda però è orami sconfinata in un argomento diverso da quello oggetto della tua domanda iniziale ... sarebbe meglio, se hai ancora necessità, creare un nuovo thread

     


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato



    martedì 24 maggio 2011 19:50
  • Ciao Renato grazie mille della tua pazienza che hai avuto con me per risolvere questo problema. Il problema è risolto, ho fatto come mi hai detto cioè separare il nome del file da eseguire dagli argomenti da passargli. Grazie mille di nuovo adesso mi metto a lavoro che è difficilotto fare questa cosa (almeno per me) Saluti e di nuovo grazie per l'enessima volta, Andrea!
    mercoledì 25 maggio 2011 07:44