2012-12-31 14 views
8

Qual è l'ordine di lettura predefinito per il metodo Directory.EnumerateFiles? È coerente?Directory.EnumerateFiles read order (C#)

Nella mia esperienza fino ad ora sembra essere dalla data in cui i file sono stati creati ma non sono stato in grado di trovare conferma di ciò.

Motivo che chiedo è perché parte di un programma sto lavorando su carichi di file binari dalle directory in oggetti che vengono a loro volta caricati in array. Questi oggetti si riferiscono l'un l'altro da matrici di indici, il che significa che l'ordine in cui sono caricati nei loro array deve rimanere coerente (per evitare di cambiare gli indici).

Mentre sono qui, ho un'altra domanda minore. Quando i file vengono cancellati, ovviamente cambia gli indici dei file caricati negli array, qualunque cosa io faccia. Qualche suggerimento per evitare questo problema? Ho evitato di usare un dizionario fino ad ora a causa di preoccupazioni sullo storage (preferisco non archiviare array di chiavi testuali se posso evitarlo) ma se è l'unico approccio possibile, potrei doverlo implementare comunque.


EDIT: Dopo gli ottimi consigli dai tuoi risposte, ho riscritta a un approccio dizionario utilizzando i nomi dei file. L'impatto sulle prestazioni è stato abbastanza trascurabile e la leggibilità e la manutenibilità sono state notevolmente migliorate, quindi ha funzionato abbastanza bene.

+0

Perché non mantenere solo un riferimento anziché un indice? Non dovresti preoccuparti che gli indici vengano mescolati se lo fai. – casperOne

+0

A causa del modo in cui la serializzazione dei file funziona. Se dovessi salvare file contenenti riferimenti tramite serializzazione e quindi caricare quei file, caricarei l'intero albero degli oggetti ogni volta con conseguente duplicazione di massa. Ad esempio, se Car fa riferimento a Tyre e Truck reference Tire e sono entrambi salvati e quindi caricati, avrei 2 istanze duplicate di Tyre. – Djentleman

+2

Tratto da [MSDN] (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), su 'GetFiles' (che essenzialmente chiama' EnumerateFiles'): * L'ordine dei nomi dei file restituiti è non garantito; usa il metodo Sort() se è richiesto un ordinamento specifico. * Ti suggerisco, come dice la documentazione, di utilizzare il tuo metodo di ordinamento. – Mir

risposta

10

Per quanto posso dire, non è documentato - quindi anche se si può individuare uno schema, non si deve fare affidamento su di esso. Può dipendere dalla versione di .NET o dalla versione del sistema operativo o semplicemente passare da un Service Pack all'altro. Invece, se hai bisogno di un ordine specifico, dovresti ordinarlo tu stesso. Naturalmente, sfortunatamente, è necessario trovare tutti i nomi dei file prima di elaborarli, ma vi darà coerenza.

Per essere onesti, sembra che tu abbia un modello di dati molto fragile. Non ci hai detto abbastanza su cosa stai facendo per risolverlo, ma l'utilizzo dell'indice intero di un file all'interno dei risultati di Directory.EnumerateFiles è sicuramente l'approccio migliore è.

Se è stato utilizzato il file nome al posto dell'indice, che permetterebbe di elaborare i file come li leggete, potenzialmente - ma ci possono essere approcci ancora migliori, a seconda di quello che stai cercando di fare. L'uso del nome dovrebbe essere ancora abbastanza economico: sarà solo un riferimento a una stringa singola invece di un intero e, anche se verrà utilizzato in più punti, saranno diversi riferimenti allo stesso oggetto stringa.

4

La documentazione non specifica l'ordine, ma è sempre possibile forzare l'ordine desiderato utilizzando la funzione OrderBy di LINQ.

È possibile saltare le modifiche dell'indice cancellando i riferimenti a null anziché rimuovere effettivamente gli elementi dall'array. Il compromesso qui è che ora devi verificare se l'articolo all'indice indicato è null.

Se si dispone di una struttura dati più leggibile basata su un , prendere in considerazione la possibilità di passare ad esso e ignorare i problemi di efficienza finché il profiler non ti dice che è necessario ottimizzare questa particolare parte del codice.

13

L'API Win32 sottostante utilizzata da .NET è FindFirstFile e FindNextFile.documentation specifically states:

L'ordine in cui questa funzione restituisce i nomi dei file dipende dal tipo di file system. Con il file system NTFS e il file system CDFS, i nomi vengono di solito restituiti in ordine alfabetico. Con i file system FAT, i nomi vengono di solito restituiti nell'ordine in cui i file sono stati scritti sul disco, che possono essere o meno in ordine alfabetico. Tuttavia, come affermato in precedenza, questi comportamenti non sono garantiti.

Quindi no, non è possibile garantire l'ordine di restituzione dei file. Le altre risposte forniscono modi sufficienti per aggirare questo comportamento.

+0

Grazie. Utile! – Shimmy

+0

Mi piace questo dettaglio tecnico e il link. – Gqqnbig