2013-04-15 1 views
1

J'ai vu un exemple très proche ici:Comment trier mon tableau de chaînes à partir de .GetFiles() dans l'ordre de la date de la dernière modification dans asp.net-webpages?

Sorting Files by date

Mais je suis nouveau à LINQ et ne pouvait pas le faire fonctionner (pas sûr que je comprends les classes DirectoryInfo ou FileInfo).

Voici les extraits de code nécessaires:

(Lors de l'affectation de la matrice):

string[] files = Directory.GetFiles(Server.MapPath("~/User_Saves/" + WebSecurity.CurrentUserName), "*.xml"); 

for(int i = 0; i < files.Length; i++) 
{ 
    files[i] = files[i].Substring(files[i].LastIndexOf("\\") + 1); 
    files[i] = files[i].Substring(0, files[i].Length - 4); 
} 

(Cette dernière partie, à savoir, la 'boucle', les bandes simplement le chemin du fichier et la seule extension de fichier attendue, qui est ".xml", bien sûr, à partir de la chaîne, ne laissant que le nom de fichier propre).

(Lors de l'écriture du tableau):

[cet extrait peut ne pas être nécessaire pour répondre à cette question, mais juste au cas où]

@foreach(string file in files) 
{ 
    <p> 
     <button title="Permanently delete the requisition named, &quot;@file&quot" type="button" id="@file" class="fileDelBtn">DEL</button>&nbsp;<span style="color: #000;">~</span>&nbsp;<span id="@file" class="listFile">@file</span> 
    </p> 
    hasSavedFiles = true; 
} 

choses que j'ai essayé:

string [] files = new DirectoryInfo(Server.MapPath("~/User_Saves/" + WebSecurity.CurrentUserName)).GetFiles().OrderBy(files => files.LastWriteTime).ToArray; 

Echoue à cause de cette erreur: CS0136: Une variable locale nommée 'files' ne peut pas être déclarée dans cette portée car elle donnerait une autre variable ce qui signifie «fichiers», qui est déjà utilisé dans une portée «parent ou courant» pour désigner autre chose

Pour un, je ne peux pas comprendre l'opérateur lambda, pour la vie de moi, même après avoir regardé ici: http://msdn.microsoft.com/en-us/library/bb311046.aspx (des éclaircissements à ce sujet seraient grandement appréciés, mais ce n'est pas vraiment la question principale, par tous les moyens). Deuxièmement, en utilisant cet exemple, je sais que DirectoryInfo() n'a pas de surcharge qui prend 2 arguments, donc je peux perdre ma capacité à "Get" seulement "* .xml" fichiers, que j'aimerais conserver, mais n'est probablement pas absolument nécessaire.

Comme toujours, toute aide est grandement appréciée et si d'autres informations pourraient vous être utiles, n'hésitez pas à demander.

+0

changer simplement à '.OrderBy (f => f.LastWriteTime)' –

+0

@IliaG Je vais essayer maintenant. Qu'est-ce que f, dans cet exemple? – VoidKing

+0

'f' est l'élément dans le tableau de fichiers –

Répondre

4
var filesInOrder = new DirectoryInfo(path).GetFiles() 
         .OrderByDescending(f => f.LastWriteTime) 
         .Select(f => f.Name) 
         .ToList(); 
+0

Juste pour que je sache à quoi m'attendre, cela va me donner une liste et non un tableau correct? (Ce n'est pas un problème, bien sûr) – VoidKing

+0

@VoidKing si vous avez besoin de tableau, alors utilisez 'ToArray()' au lieu de 'ToList()' –

+0

Honnêtement, l'une ou l'autre façon me convient, mais y a-t-il un moyen de l'éviter d'ajouter des fichiers qui ne se terminent pas avec ".xml" ou supprimer des fichiers qui ne se terminent pas par ".xml"? – VoidKing

0

Une chose comme ceci va faire si vous ne voulez pas énumérer les fichiers tout de suite.

public static IEnumerable<string> GetXmlFilesByLastWriteTime(string path) 
{ 
    var directoryInfo = new DirectoryInfo(path); 
    if(!directoryInfo.Exists) return Enumerable.Empty<string>(); 

    var query = 
     from file in directoryInfo.GetFiles() 
     where file.Extension.ToLower() == ".xml" 
     orderby file.LastWriteTime 
     select file.Name; 

    return query; 
} 

Utilisation:

var files = GetXmlFilesByLastWriteTime(path).ToList(); 
Questions connexes