Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB NET] Ricerca di un file usando *
Forum - C# / VB.NET - [VB NET] Ricerca di un file usando *

Avatar
wuolfit (Normal User)
Pro


Messaggi: 95
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 11:14
Martedì, 11/10/2011
Salve a tutti,
il mio problema è il seguente : Ho creato un programma di ricerca che funziona egregiamente, difatti una volta impostato il path, puoi trovare il file che ti interessa, digitando il nome o parte di esso, o in alternativa selezionando la data di creazione o modifica, però adesso vorrei poter ricercare i file all'interno del path che gli indico usando * o in alternativa *.* al posto del nome, potreste darmi qualche dritta su come fare????
Grazie infinite per l'aiuto


WuOlFiT
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:47
Martedì, 11/10/2011
Scusa, ma se hai già scritto un programma, come possiamo darti consigli se non ne vediamo il codice?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Segnala al moderatore
Postato alle 11:50
Martedì, 11/10/2011
Quoto nessuno; comunque dovresti dirci come il programma controlla quello che immette l'utente. Se questo controllo è effettuato da una if allora basta che tu includa anche il caso in cui l'utente inserisce nella textbox ( per esempio ) il carattere "*" o "*.*", a quel punto ti elenca tutti i files.


Hai perso.
PM Quote
Avatar
wuolfit (Normal User)
Pro


Messaggi: 95
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 12:02
Martedì, 11/10/2011
Tutto il codice del mio programma ve lo riporto di seguito :

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2. Imports Microsoft.Win32
  3. Public Class Cerca
  4. #Region "Procedure, funzioni"
  5.     Public Sub SearchFiles(ByVal Dir As String, ByVal SubDir As Boolean)
  6.         Dim Files() As String = Directory.GetFiles(Dir)
  7.         Dim Dirs() As String = Directory.GetDirectories(Dir)
  8.         lblStatus.Text = "Ricerca nella directory " + Dir + " in corso..."
  9.         For Each S As String In Files
  10.             Results.Add(S)
  11.             Application.DoEvents()
  12.         Next
  13.         If SubDir Then
  14.             For Each S As String In Dirs
  15.                 SearchFiles(S, True)
  16.                 Application.DoEvents()
  17.             Next
  18.         End If
  19.     End Sub
  20.     Public Sub SearchDirectories(ByVal Dir As String)
  21.         Dim Dirs() As String = Directory.GetDirectories(Dir)
  22.         For Each S As String In Dirs
  23.             Directories.Add(S)
  24.             SearchDirectories(S)
  25.         Next
  26.     End Sub
  27.     Public Sub AddFileToList(ByVal FileName As String)
  28.         Dim S(1) As String
  29.         Dim L As ListViewItem
  30.         S(0) = Path.GetFileName(FileName)
  31.         S(1) = FileName
  32.         L = New ListViewItem(S)
  33.         L.Group = lstResult.Groups(0)
  34.         lstResult.Items.Add(L)
  35.     End Sub
  36.     Public Sub AddDirToList(ByVal DirName As String)
  37.         Dim S(1) As String
  38.         Dim L As ListViewItem
  39.         S(0) = GetDirName(DirName)
  40.         S(1) = DirName
  41.         L = New ListViewItem(S)
  42.         L.Group = lstResult.Groups(1)
  43.         lstResult.Items.Add(L)
  44.     End Sub
  45.     Public Sub Transfer(ByRef ArFrom As ArrayList, ByRef ArTo As ArrayList)
  46.         ArTo.Clear()
  47.         For Each S As String In ArFrom
  48.             ArTo.Add(S)
  49.         Next
  50.         ArFrom.Clear()
  51.     End Sub
  52.     Public Function GetDirName(ByVal Dir As String) As String
  53.         Return Dir.Remove(0, Dir.LastIndexOf("\") + 1)
  54.     End Function
  55.     Public Function GetDirLen(ByVal Dir As String) As Double
  56.         Dim Size As Double
  57.         Dim Files() As String = Directory.GetFiles(Dir)
  58.         Dim Dirs() As String = Directory.GetDirectories(Dir)
  59.         For Each S As String In Files
  60.             Size += FileLen(S)
  61.         Next
  62.         For Each S As String In Dirs
  63.             Size += GetDirLen(S)
  64.         Next
  65.         Return Size
  66.     End Function
  67.         Public Function GetIcon(ByVal Ext As String) As Icon
  68.         Dim RegKey As RegistryKey
  69.         Dim KeyName As String
  70.         Dim Icn As Icon
  71.         RegKey = Registry.ClassesRoot.OpenSubKey(Ext)
  72.         KeyName = RegKey.GetValue("(Predefinito)")
  73.         RegKey = Registry.ClassesRoot.OpenSubKey(KeyName).OpenSubKey("DefaultIcon")
  74.         If RegKey Is Nothing Then
  75.             Return Nothing
  76.         End If
  77.         KeyName = RegKey.GetValue("(Predefinito)")
  78.         Icn = Drawing.Icon.ExtractAssociatedIcon(KeyName)
  79.         Return Icn
  80.     End Function
  81. #End Region
  82.     Public Results As New ArrayList
  83.     Public Directories As New ArrayList
  84.     Private Sub chbWord_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chbWord.CheckedChanged
  85.         grpWord.Enabled = chbWord.Checked
  86.     End Sub
  87.         Private Sub cmdBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBrowse.Click
  88.         F.Description = "Selezionare la cartella in cui cercare:"
  89.         If F.ShowDialog = Windows.Forms.DialogResult.OK Then
  90.             txtDir.Text = F.SelectedPath
  91.         End If
  92.     End Sub
  93.     Private Sub cmdSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSearch.Click
  94.         If txtDir.Text = Nothing Then
  95.             MsgBox("Nessuna directory inserita: impossibile iniziare la ricerca!", MsgBoxStyle.Exclamation)
  96.             Exit Sub
  97.         End If
  98.         If chbWord.Checked And txtWord.Text = Nothing Then
  99.             MsgBox("Specificare una parola da cercare nel nome del file!", MsgBoxStyle.Exclamation)
  100.             Exit Sub
  101.         End If
  102.                 If chbDate.Checked And (cmbField.SelectedIndex < 0 Or cmbWhen.SelectedIndex < 0) Then
  103.             MsgBox("Inserire tutti i campi necessari per condurre una ricerca basata sulla data!", MsgBoxStyle.Exclamation)
  104.             Exit Sub
  105.         End If
  106.                 Results.Clear()
  107.         lstResult.Items.Clear()
  108.         SearchFiles(txtDir.Text, chbSubDir.Checked)
  109.                 Dim Backup As New ArrayList
  110.         Dim W As StreamWriter = Nothing
  111.         If chbWord.Checked Then
  112.             lblStatus.Text = "Selezione dei file che contengano la parola '" + txtWord.Text + "' nel proprio nome in corso..."
  113.             Dim N As String
  114.             For Each S As String In Results
  115.                 N = Path.GetFileName(S)
  116.                 If chbCase.Checked Then
  117.                     If N.ToLower.Contains(txtWord.Text.ToLower) Then
  118.                         Backup.Add(S)
  119.                     End If
  120.                 Else
  121.                     If N.Contains(txtWord.Text) Then
  122.                         Backup.Add(S)
  123.                     End If
  124.                 End If
  125.                 Application.DoEvents()
  126.             Next
  127.             Transfer(Backup, Results)
  128.             lblStatus.Text = "Selezione delle cartelle che contengano la parola '" + txtWord.Text + "' nel proprio nome in corso..."
  129.             For Each S As String In Directories
  130.                 N = GetDirName(S)
  131.                 If chbCase.Checked Then
  132.                     If N.ToLower.Contains(txtWord.Text.ToLower) Then
  133.                         Backup.Add(S)
  134.                     End If
  135.                 Else
  136.                     If N.Contains(txtWord.Text) Then
  137.                         Backup.Add(S)
  138.                     End If
  139.                 End If
  140.                 Application.DoEvents()
  141.             Next
  142.             Transfer(Backup, Directories)
  143.         End If
  144.                 If chbDate.Checked Then
  145.             lblStatus.Text = "Selezione dei file " + cmbField.SelectedItem + " " + cmbWhen.SelectedItem + " " + mclDate.SelectionRange.Start.ToShortDateString
  146.             Dim F As FileInfo
  147.             Dim P As DirectoryInfo
  148.             Dim D As Date
  149.             Dim Selected As Date = mclDate.SelectionRange.Start
  150.             For Each S As String In Results
  151.                 F = New FileInfo(S)
  152.                 Select Case cmbField.SelectedIndex
  153.                     Case 0
  154.                         D = F.LastWriteTime
  155.                     Case 1
  156.                         D = F.CreationTime
  157.                     Case 2
  158.                         D = F.LastAccessTime
  159.                 End Select
  160.                 Select Case cmbWhen.SelectedIndex
  161.                     Case 0
  162.                         If D.CompareTo(Selected) < 0 Then
  163.                             Backup.Add(S)
  164.                         End If
  165.                     Case 1
  166.                         If D.CompareTo(Selected) = 0 Then
  167.                             Backup.Add(S)
  168.                         End If
  169.                     Case 2
  170.                         If D.CompareTo(Selected) > 0 Then
  171.                             Backup.Add(S)
  172.                         End If
  173.                 End Select
  174.             Next
  175.             Transfer(Backup, Results)
  176.  
  177.             lblStatus.Text = "Selezione delle cartelle " + cmbField.SelectedItem + " " + cmbWhen.SelectedItem + " " + mclDate.SelectionRange.Start.ToShortDateString
  178.             For Each S As String In Directories
  179.                 P = New DirectoryInfo(S)
  180.                 Select Case cmbField.SelectedIndex
  181.                     Case 0
  182.                         D = P.LastWriteTime
  183.                     Case 1
  184.                         D = P.CreationTime
  185.                     Case 2
  186.                         D = P.LastAccessTime
  187.                 End Select
  188.                 Select Case cmbWhen.SelectedIndex
  189.                     Case 0
  190.                         If D.CompareTo(Selected) < 0 Then
  191.                             Backup.Add(S)
  192.                         End If
  193.                     Case 1
  194.                         If D.CompareTo(Selected) = 0 Then
  195.                             Backup.Add(S)
  196.                         End If
  197.                     Case 2
  198.                         If D.CompareTo(Selected) > 0 Then
  199.                             Backup.Add(S)
  200.                         End If
  201.                 End Select
  202.             Next
  203.             Transfer(Backup, Directories)
  204.         End If
  205.                 If chbReport.Checked Then
  206.             W = New StreamWriter(Application.StartupPath + "\Report di " + Date.Now.ToLongDateString + ", ore " + Date.Now.ToShortTimeString + ".txt")
  207.         End If
  208.         For Each S As String In Results
  209.             AddFileToList(S)
  210.             If chbReport.Checked Then
  211.                 W.WriteLine(S)
  212.             End If
  213.         Next
  214.         For Each S As String In Directories
  215.             AddDirToList(S)
  216.             If chbReport.Checked Then
  217.                 W.WriteLine(S)
  218.             End If
  219.         Next
  220.         If chbReport.Checked Then
  221.             W.Close()
  222.         End If
  223.         lblStatus.Text = "Operazione completata: trovati " & Results.Count & " files e " & Directories.Count & " cartelle"
  224.     End Sub
  225.         Private Sub lstResult_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstResult.SelectedIndexChanged
  226.         Try
  227.             Dim Selected As ListViewItem = lstResult.SelectedItems(0)
  228.             If Selected.Group Is lstResult.Groups(0) Then
  229.                 Dim F As New FileInfo(Selected.SubItems(1).Text)
  230.                 txtInfo.Text = F.Name + vbCrLf + vbCrLf + "Creato il " + F.CreationTime.ToShortDateString + " alle ore " + F.CreationTime.ToShortTimeString + vbCrLf + "Modificato il " + F.LastWriteTime.ToShortDateString + " alle ore " + F.LastWriteTime.ToShortTimeString + vbCrLf + "Aperto l'ultima volta il " + F.LastAccessTime.ToShortDateString + " alle ore " + F.LastAccessTime.ToShortTimeString + vbCrLf + "Grande complessivamente " & F.Length & " bytes (" + RoundSize(F.Length) + ")" + vbCrLf + vbCrLf + "Percorso completo: " + vbCrLf + F.FullName
  231.             Else
  232.                 Dim D As New DirectoryInfo(Selected.SubItems(1).Text)
  233.                 Dim L As Double = GetDirLen(D.FullName)
  234.                 txtInfo.Text = D.Name + vbCrLf + vbCrLf + "Creata il " + D.CreationTime.ToShortDateString + " alle ore " + D.CreationTime.ToShortTimeString + vbCrLf + "Modificata il " + D.LastWriteTime.ToShortDateString + " alle ore " + D.LastWriteTime.ToShortTimeString + vbCrLf + "Aperta l'ultima volta il " + D.LastAccessTime.ToShortDateString + " alle ore " + D.LastAccessTime.ToShortTimeString + vbCrLf + "Grande complessivamente " & L & " bytes (" + RoundSize(L) + ")" + vbCrLf + vbCrLf + "Percorso completo: " + vbCrLf + D.FullName
  235.             End If
  236.         Catch aOoRE As ArgumentOutOfRangeException
  237.         End Try
  238.     End Sub



WuOlFiT
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 13:56
Martedì, 11/10/2011
Per fare una ricerca fornendo l'estensione puoi usare la funzione GetFiles della classe directory Directory (Namespace IO)

esempio

Codice sorgente - presumibilmente Plain Text

  1. IO.Directory.GetFiles(path, "*.mp3")



al posto di *.mp3 puoi inserire * o *.* per cercare tutti i files.

La funzione accetta anche un terzo overload per estendere la ricerca anche a tutto l'albero delle sottodirectory.

Un limite della funzione è che accetta solo un'estensione. Non puoi fare una cosa di questo tipo *.mp3|*.aac|*.jpeg

P.S. Un consiglio. Non ho letto tutto il codice, ma ho notato che concateni molte stringhe con l'operatore +.
Quando le concatenazioni iniziano ad essere numerose, è più performante utilizzare uno StringBuilder (http://msdn.microsoft.com/it-it/library/system.text.string ....


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
wuolfit (Normal User)
Pro


Messaggi: 95
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 15:59
Martedì, 11/10/2011
Grazie Dedalux per il tuo consiglio.......quindi se non ho capito male dovrei trasformare ciò che avevo scritto :

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2. Imports Microsoft.Win32
  3. Public Class Cerca
  4. Region "Procedure, funzioni"
  5. Public Sub SearchFiles(ByVal Dir As String, ByVal SubDir As Boolean)
  6.         Dim Files() As String = Directory.GetFiles(Dir)
  7.         Dim Dirs() As String = Directory.GetDirectories(Dir)



in :

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2. Imports Microsoft.Win32
  3. Public Class Cerca
  4. Region "Procedure, funzioni"
  5.     Public Sub SearchFiles(ByVal Dir As String, ByVal SubDir As Boolean)
  6.         Dim Files() As String = Directory.GetFiles(Dir, "*")
  7.         Dim Dirs() As String = Directory.GetDirectories(Dir)



Per quanto riguarda lo StringBuilder mi stò documentando.....grazie di nuovo


WuOlFiT
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 15:26
Mercoledì, 12/10/2011
Esatto.

Comunque se quel parametro SubDir ti serve per specificare se la funzione deve cercare anche nelle subdirectories potresti fare una cosa cosi

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Files() As String = IO.Directory.GetFiles(Dir, "*", IIf(SubDir, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly))


Ultima modifica effettuata da Dedalux il 12/10/2011 alle 15:27


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
wuolfit (Normal User)
Pro


Messaggi: 95
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 10:40
Lunedì, 07/11/2011
Grazie mille ho risolto.....gentilissimo....


WuOlFiT
PM Quote