11 messaggi dal 30 maggio 2007
E' Possibile avere lo stesso risultato del sort di explorer per nome in vb net?

Mi spiego ho una cartella con un'elenco di file che sono prenumerati subito seguiti dal nome file (Es: 1_pippo.txt).
Al momento del caricamento su un array il sort mi da dei problemi del tipo che mi mette tutti i file che inziano per 1 poi per 2 e così via (Es 1,10,11,12,2,23..)

Possibile che con Sort, SortedList, SortOrder e ICompare non risco ad avere lo stesso risultato?

Grazie a tutti
Fabio
Modificato da Fabietto79 il 12 dicembre 2008 20.30 -
Modificato da Fabietto79 il 12 dicembre 2008 20.31 -
301 messaggi dal 31 maggio 2006
ciao
il problema è che l'ordinamento è di stringhe (cioè sui caratteri che le compongono) quindi 1, 10, 11, 2 etc etc (ma questo è anche l'ordinamento di explorer). Puoi rinominare il file come 001,002,003 cosi l'ordinamento corrisponde a quello che vuoi
3.939 messaggi dal 28 gennaio 2003
pagina aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="scrivere_leggere_files_in_directory_sort.aspx.vb" Inherits="prove_scrivere_leggere_files_in_directory_sort" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Pagina senza titolo</title>
    <link href="../../stili/Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="crea i files" />&nbsp;<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Leggi files" /></div>
    </form>
</body>
</html>


codice basic
Option Strict On
Imports l = libreria.ModuloWeb

Partial Class prove_scrivere_leggere_files_in_directory_sort
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        'scrivo 20 files in c:\tmp\tmp, da 1_prova.txt a 20_prova.txt
        Dim percorso As String = "c:\tmp\tmp"
        If Not Directory.Exists(percorso) Then
            Directory.CreateDirectory(percorso)
        End If
        For i As Integer = 1 To 20
            Dim s As String = i.ToString() & "_prova.txt"
            Dim f As String = Path.Combine(percorso, s)
            Dim sw As StreamWriter = File.CreateText(f)
            sw.Close()
        Next

    End Sub

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        'lista i files ordinandoli per inizio nome
        Dim percorso As String = "c:\tmp\tmp"
        If Not Directory.Exists(percorso) Then
            Directory.CreateDirectory(percorso)
        End If
        'vettore dei files 
        Dim fs As String() = Directory.GetFiles(percorso)

        'vettore ausiliario per l'ordinamento 
        Dim va(fs.Length - 1) As Integer
        For i As Integer = 0 To va.Length - 1
            Dim fse As String = Path.GetFileNameWithoutExtension(fs(i))
            Dim p As Integer = fse.IndexOf("_"c)
            Dim num As String = fse.Substring(0, p)

            va(i) = Integer.Parse(num)
        Next
        Array.Sort(va, fs)

        Dim sb As New StringBuilder()
        sb.Append("<Table>")
        For Each f As String In fs
            sb.Append("<tr><td>" & Path.GetFileName(f) & "</td></tr>")
        Next
        sb.Append("</table>")
        Me.form1.Controls.Add(New LiteralControl(sb.ToString()))

    End Sub

End Class
11 messaggi dal 30 maggio 2007
Ti ringrazio per la dettagliata risposta. ma explorer si comporta differentemente dal sort che faccio sull'array dei file che ho... per questo pensavo e credo ci sia un metodo per far si che posso ordinare i file di una cartella...

Grazie
Fabio
3.939 messaggi dal 28 gennaio 2003
Fabietto79 ha scritto:
Ti ringrazio per la dettagliata risposta. ma explorer si comporta differentemente dal sort che faccio sull'array dei file che ho... per questo pensavo e credo ci sia un metodo per far si che posso ordinare i file di una cartella...

Grazie
Fabio


Io penso che bisogna pur guardare il codice che viene proposto, specialmente se risolve il problema, nè più nè meno come viene consigliato in letteratura.

Una variante, però più limitativa rispetto a quella proposta, è quello di utilizzare un vettore ausiliario di stringhe e non di integer. Questo vettore dovrà essere riempito da 'nome_file.PadLeft(260)' ossia dal nome del file allineato a destra in una stringa di 260 caratteri.

ps. non credo che funzioni con nomi tipo, pippo_1.txt, pippo_2.text,...
11 messaggi dal 30 maggio 2007
Si è vero.. infantti la mi ultima solutionze è la solita "porcata" ovvero spitto in una matrice la parte numerica e il resto del nome file... sorto per il primo campo che sarà di soli numeri e poi e poi riaccorpo la matrice...

il fatto che mi fa rosicare è che il codice che uso per aprire la cartella ha il metodo sort ma non riesco a utilizzarlo come vorrei io... forse sbaglio qualcosa...

"System.IO.Directory.GetFiles(StrFolderIN, "*.txt").Sort(...."

Comunque grazie del codice
Saluti
Fabio
3.939 messaggi dal 28 gennaio 2003
sono contento che abbia risolto.

Guarda questo link

http://madebits.com/articles/numsort/index.php

ciao

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.