Filtrare file in ordine alfabetico

di il
16 risposte

Filtrare file in ordine alfabetico

Salve!
Ho la sub sottoscritta che estrae i file .jpg da una cartella "TempDIr" in un percorso "path" e va a popolare una ImageList associata ad una Listview.
 Sub PopolaLWJpg()
        Dim Path As String = TextPathDEL.Text & "\" & "TempDir"
        Try

           For Each file In System.IO.Directory.GetFiles(Path)
                If file.Contains(".jpg") = True Then
                    Dim list As New ListViewItem(IO.Path.GetFileNameWithoutExtension(file))
                    ImageList1.Images.Add(file, GetImmagine(file))
                    list.ImageKey = file
                    list.SubItems.Add(file)
                    ListView1.Items.Add(list)
                End If
            Next
        Catch ex As Exception
        End Try
    End Sub
I file .jpg non sono altro che le pagine di un file pdf convertite e sono nominate Page , Page2, Page 3 ecc..
Succede con i file .pdf molto grandi che la ListView non si popoli con i file in ordine di pagina, il che costituisce un problema per me.
credo dipenda dal fatto che il framework stia ancora ordinando la cartella e che quindi la lanciata la sub PopolaLWJpg trovi i file in maniera sparsa e li carichi cosìnella ImageList.
Mi chiedevo quindi se esiste la maniera di implementare la riga di comando:
 For Each file In System.IO.Directory.GetFiles(Path)
con un order by per ottenere i file in ordine alfabetico.
spero di essere stato chiaro.
grazie

16 Risposte

  • Re: Filtrare file in ordine alfabetico

    Usa le funzionalità di LINQ e aggiungi un criterio di ordinamento usando il metodo OrderBy sull'array dei percorsi restituiti:
    
     For Each file In System.IO.Directory.GetFiles(Path).OrderBy(Function(path) path)
    
    E' chiaro che la generazione dei nomi dei file delle pagine dovrà usare una "convenzione pesata" aggiungendo degli zeri, ossia adottare un formato del tipo: Page001.jpg, Page002.jpg, Page003.jpg, Page999.jpg; in caso contrario, l'ordinamento (essendo alfabetico) non potrà andare a buon fine.

    Ciao!
  • Re: Filtrare file in ordine alfabetico

    Con questo non ottieni il risultato voluto?
    string path = @"C:\Users\test\Desktop";
              var sortedList = Directory.GetFiles(path).OrderBy(f => f).ToList();
                
  • Re: Filtrare file in ordine alfabetico

    Ho provato così:
    For Each file In System.IO.Directory.GetFiles(Path).OrderBy(Function(f) f).ToList()
     If file.Contains(".jpg") = True Then
                        Dim list As New ListViewItem(IO.Path.GetFileNameWithoutExtension(file))
                                          ImageList1.Images.Add(file, GetImmagine(file))
                        list.ImageKey = file
                        list.SubItems.Add(file)
                        ListView1.Items.Add(list)
                    End If
                Next
    
    Ma nulla. La listview si popola sempre alla rinfusa senza seguire l'ordine che pur nella cartella c'è in quanto sono ordinati per nome. con file di poche pagine va bene. ma appena aumentano invece no.
    poi così:
     Sub PopolaLWJpg()
            Dim Path As String = TextPathDEL.Text & "\" & "TempDir"
    
            Dim sortedList = Directory.GetFiles(Path).OrderBy(Function(f) f).ToList()
    
            Try
    
                For Each file In sortedList
                    If file.Contains(".jpg") = True Then
                        Dim list As New ListViewItem(IO.Path.GetFileNameWithoutExtension(file))
                        ImageList1.Images.Add(file, GetImmagine(file))
                        list.ImageKey = file
                        list.SubItems.Add(file)
                        ListView1.Items.Add(list)
                    End If
                Next
            Catch ex As Exception
            End Try
        End Sub   
    Praticamente uguale. Comincio a pensare che il problema risieda da qualche altra parte.
    Proverò la soluzione di Alka che però merita un po più di studio.
    Domanda. Non si Può ordinare direttamente la ListView per nome dei file una volta che si è popolata dalla ImageList?
  • Re: Filtrare file in ordine alfabetico

    Non ho risolto ma ho capito l'arcano. mette in ordine in questa maniera:
    1, 10, 11, 12....... 19- e poi ....2, 3, 4
    in pratica mette prima tutti i numeri con l'uno come prima cifra da sx, poi il due prima cifra da sx ecc.....
    singolare..
  • Re: Filtrare file in ordine alfabetico

    Giuseppe1974 ha scritto:


    Non ho risolto ma ho capito l'arcano. mette in ordine in questa maniera:
    singolare..
    Non c'è nulla di inatteso in questo comportamento.

    E te l'avevo pure anticipato nella mia risposta immaginando che il problema potesse essere dovuto a questo, quando ti ho detto esattamente quanto segue (cito me stesso):
    E' chiaro che la generazione dei nomi dei file delle pagine dovrà usare una "convenzione pesata" aggiungendo degli zeri, ossia adottare un formato del tipo: Page001.jpg, Page002.jpg, Page003.jpg, Page999.jpg; in caso contrario, l'ordinamento (essendo alfabetico) non potrà andare a buon fine.
    Quando ho usato i termini "è chiaro che" e "dovrà" sottolineavo che si trattava di un passaggio obbligato e non opzionale.

    E sicuramente è tutto fuorché arcano o singolare, così come lo definisci.

    Stiamo parlando di stringhe, di testo, quindi ordinando alfabeticamente una sequenza simile a
  • Re: Filtrare file in ordine alfabetico

    C'è un sistema ancora più semplice, e cioè caricare la ListView usando un contatore numerico e trasformandolo in stringa, una cosa del genere:
    For x = 1 to 100
       If Not My.Computer.FileSystem.FileExist("Page" & x.ToString & ".jpg") Then Exit For
       CaricaImmagine("Page" & x.ToString & ".jpg")
    Next
    in questo caso non hai problemi di aggiungere gli zeri
  • Re: Filtrare file in ordine alfabetico

    Si Alka hai ragione. effettivamente proprio le tue affermazioni mi hanno messo sulla strada giusta. altrimenti avrei dato per casuale l'ordinamento dei nomi.
    naturalmente è arcano per me, perchè non lo sapevo, e visto che nella cartella vengono ordinati in maniera giusta mi spettavo che li leggesse nella stessa maniera, così come fa fino al nr. 9. ma evidentemente non così non è.
    per quanto riguarda i nomi "pesati" sarebbe forse la soluzione piu' semplice. ma forse non ho ben capito. perchè dovrebbe funzionare diversamete?
    non li leggerebbe cmq in questo modo?? 001010 011 012 013.........019 002 003 004 005 006 007 008 009 ????
    visto che conosco in anticipo quali file conterrà la cartella ed i nomi che avranno posso aggiungerli con un ciclo for che generi di nuovo i i nomi dei file .jpg da "prelevare" ed aggiungere alla ImageList. credo sia la soluzione più economica in temini di lavoro e di tempo.
  • Re: Filtrare file in ordine alfabetico

    Sirjo la seconda delle mie soluzione è in pratica quella che mi hai suggerito tu. mi metto a lavoro e vediamo ....grazie in ogni caso
  • Re: Filtrare file in ordine alfabetico

    SirJo ha scritto:


    C'è un sistema ancora più semplice, e cioè caricare la ListView usando un contatore numerico e trasformandolo in stringa, una cosa del genere:
    [...]
    in questo caso non hai problemi di aggiungere gli zeri
    Pur essendo semplice, è inefficiente: devi verificare l'esistenza di ogni singolo file e stabilire anche un limite massimo al numero da controllare, e più sono i file più è elevato il tempo che viene richiesto.

    Aggiungere operazioni di I/O che si possono evitare per venire incontro alle limitazioni dello sviluppatore, per me, è un principio sbagliato.

    Non bisogna dare sempre per scontato che l'utente sia dotato dell'SSD più veloce disponibile sul mercato...
  • Re: Filtrare file in ordine alfabetico

    Allora ho risolto così adottando la soluzione di SirJo. Mi è sembrata quella più adatta al problema ed alla mia portata:
      Sub PopolaLWJpg(pdfFile As String)'pdffile è il file pdf che è statgo scomposto in pagine .jpg
            Dim Path As String = TextPathDEL.Text & "\" & "TempDir" 'path è la directory che contiene i file .jpg da caricare nella imagelist
            Dim reader = New PdfReader(TextPath.Text & "\" & pdfFile) ' creo una nuova istanza di reader con il pdf in questione
            Dim file As String 'dichiaro la variabile stringa file che sarà composta da nome del file .jpg da leggere con ciclo for
            Try
                For I As Integer = 1 To reader.NumberOfPages 'ottengo il numero di pagine che mi indica il nr di volte da eseguire il ciclo for
                  ' ------------carico la imagelist e la listview-------------------
                    file = Path & "\" & "Page " & I & ".jpg" ' costruisco il nome del file in ordine crescente da leggere nella cartella che contiene i file .jpg
                    Dim list As New ListViewItem(IO.Path.GetFileNameWithoutExtension(file))              
                    ImageList1.Images.Add(file, GetImmagine(file))
                    list.ImageKey = file
                    list.SubItems.Add(file)
                    ListView1.Items.Add(list)
               '--------------------fine ciclo -------------------
                Next I
            Catch ex As Exception
            End Try
          
        End Sub
    grazie a tutti per l'aiuto. come sempre preziosi!
  • Re: Filtrare file in ordine alfabetico

    Giuseppe1974 ha scritto:


    naturalmente è arcano per me, perchè non lo sapevo, e visto che nella cartella vengono ordinati in maniera giusta mi spettavo che li leggesse nella stessa maniera, così come fa fino al nr. 9. ma evidentemente non così non è.
    Windows adotta per default un altro algoritmo (Numerical Sorting) per l'ordinamento dei file, che può essere anche disabilitato.
    In breve, non va in ordine alfabetico ma cerca di "interpretare" la parte numerica del nome del file.

    Giuseppe1974 ha scritto:


    perchè dovrebbe funzionare diversamete?
    Stiamo parlando dell'ordinamento alfabetico... questo dovresti conoscerlo, a prescindere dalla programmazione.
    Se ti chiedono di mettere una serie di nomi in ordine alfabetico, tu come procedi?

    Giuseppe1974 ha scritto:


    visto che conosco in anticipo quali file conterrà la cartella ed i nomi che avranno posso aggiungerli con un ciclo for che generi di nuovo i i nomi dei file .jpg da "prelevare" ed aggiungere alla ImageList. credo sia la soluzione più economica in temini di lavoro e di tempo.
    Se non hai possibilità di intervenire sulla generazione del nome del file JPG, ovvero se questo è determinato da una parte di codice di terze parti su cui non hai il controllo, la soluzione più rapida è quella che ti ho già scritto nella mia risposta precedente.

    Pardon, dimentico sempre che tu hai l'abitudine di chiedere aiuto e poi, tra tutte le soluzioni valide che ti vengono proposte, fare sempre e comunque di testa tua, passando così da un problema a quello successivo, derivante dalla scelta che hai fatto, e aprendo una nuova discussione per riprendere tutto da capo.

    Stiamo facendo pagine di discussione per discutere di come si ordina un array di nomi di file, non per un problema di intelligenza artificiale...
  • Re: Filtrare file in ordine alfabetico

    Alka tu non puoi che avere ragione.
    Però considera che nell'applicazione in cui viene usata questa Sub i file vengono creati per popolare la ListView e immediatamente sono cancellati.
    Non eseguo un controllo sull'esistenza degli stessi perchè so per certo quanti sono e se esistono, risparmiando così il tempo per il controllo anche se concettualmente credo che dovrebbero essere sempre previsti.
    Considera poi che questa applicazione trova spazio solo nell'ambito del mio ufficio per un uso personale e per una funzione didattica quindi non necessita dei crismi che può richiedere un prodotto che deve essere usato da terzi a scopo commerciale.
    Infine ma non per importanza, per ovvi motivi cerco la soluzione più semplice.
  • Re: Filtrare file in ordine alfabetico

    Giuseppe1974 ha scritto:


    Non eseguo un controllo sull'esistenza degli stessi perchè so per certo quanti sono e se esistono, risparmiando così il tempo per il controllo anche se concettualmente credo che dovrebbero essere sempre previsti.
    Sì, però vai a estrapolare necessariamente il numero di pagine dal PDF, che non è a costo zero.
    Comunque è senz'altro meglio della verifica dell'esistenza di ogni singolo file, in termini di accessi a disco e performance.

    Giuseppe1974 ha scritto:


    Considera poi che questa applicazione trova spazio solo nell'ambito del mio ufficio per un uso personale e per una funzione didattica quindi non necessita dei crismi che può richiedere un prodotto che deve essere usato da terzi a scopo commerciale.
    Non si tratta di "qualità" del software, ma di ragionamento e di seguire un filo logico, che in queste discussioni (almeno per me) risulta impossibile.

    Giuseppe1974 ha scritto:


    Infine ma non per importanza, per ovvi motivi cerco la soluzione più semplice.
    Se fosse vero, allora potrei tararmi anche io su questo principio, ma mi sento di smentirti nuovamente.

    La soluzione più semplice sarebbe stata sostituire la tua OrderBy(), che era praticamente già scritta, aggiugendo la parte che ti avevo suggerito io, ossia
    OrderBy(Function(filePath) Convert.ToInt32(Path.GetFileNameWithoutExtension(filePath).Substring(4)))
    e il gioco era fatto.

    Avresti dovuto scrivere pochi caratteri in più, non avresti dovuto modificare il ciclo For, non avresti dovuto leggere il numero delle pagine del PDF preventivamente e così via.

    Diciamo che adotti più un criterio di gusto completamente personale, con l'esclusione di alcune cose che non ti piacciono "a pelle", a prescindere dalla validità della proposta. Per questo dico che fatico a seguire il filo logico della discussione.

    Comunque, abbiamo risolto e quindi accontentiamoci e rallegriamoci.
  • Re: Filtrare file in ordine alfabetico

    Caro Alka ci ho provato. ma non ci sono riuscito. mi da errore. quindi ho optato per la seconda.
Devi accedere o registrarti per scrivere nel forum
16 risposte