Tri des fichiers par date

j'utilise ce code pour comparer des fichiers pour trier par date..

FileInfo f = new FileInfo(name1);
FileInfo f1 = new FileInfo(name2);
if (f.Exists && f1.Exists)
   output = DateTime.Compare(f.LastWriteTime, f1.LastWriteTime);

y a-t-il un meilleur moyen et plus rapide de trier par Date?

à la fois je peux comparer seulement 2 articles...

Je n'ai pas pu trier en récupérant tous les fichiers du répertoire.

24
demandé sur curiosity 2011-02-19 09:09:01
la source

7 ответов

Vous pouvez utiliser LINQ:

var sortedFiles = new DirectoryInfo(@"D:\samples").GetFiles()
                                                  .OrderBy(f => f.LastWriteTime)
                                                  .ToList();
50
répondu BrokenGlass 2011-02-19 09:41:28
la source
    DirectoryInfo directoryInfo = new DirectoryInfo(@"D:\Temp");
    var result = directoryInfo.GetFiles("*.*",SearchOption.AllDirectories).OrderBy(t => t.LastWriteTime).ToList();
10
répondu Alex Burtsev 2011-02-19 09:41:09
la source

Qu'en est-il de L'utilisation du tableau.Trier ?

string[] fileNames = Directory.GetFiles("directory ", "*.*");
DateTime[] creationTimes = new DateTime[fileNames.Length];
for (int i = 0; i < fileNames.Length; i++)
    creationTimes[i] = new FileInfo(fileNames[i]).CreationTime;
Array.Sort(creationTimes, fileNames);
9
répondu Vivek Goel 2014-09-05 01:49:12
la source
if (Directory.Exists(DIRECTORY_NAME))
{
     DirectoryInfo di = new DirectoryInfo(DIRECTORY_NAME);
     FileInfo[] logFiles = di.GetFiles("AN-10-log.txt*");

     DateCompareFileInfo dateCompareFileInfo = new DateCompareFileInfo();

     Array.Sort(logFiles, dateCompareFileInfo);
}

et le vous avez besoin D'une nouvelle classe Datecomprefileinfo qui implémente IComparer:

class DateCompareFileInfo : IComparer<FileInfo>
{
    /// <summary>
    /// Compare the last dates of the File infos
    /// </summary>
    /// <param name="fi1">First FileInfo to check</param>
    /// <param name="fi2">Second FileInfo to check</param>
    /// <returns></returns>
    public int Compare(FileInfo fi1, FileInfo fi2)
    {
        int result;
        if (fi1.LastWriteTime == fi2.LastWriteTime)
        {
            result = 0;
        }
        else if (fi1.LastWriteTime < fi2.LastWriteTime)
        {
            result = 1;
        }
        else
        {
            result = -1;
        }

        return result;
    }
}
4
répondu AidanO 2011-08-10 13:38:49
la source

IMPORTANT-lors de la commande par LastWriteTime, il est à noter que si le fichier n'a jamais été modifié, cette date peut retourner 1601 ou 1600. Voici ce que MSDN dit:

si le fichier décrit dans le paramètre chemin n'existe pas, cette méthode retourne 12:00 minuit, le 1er janvier, 1601 A. D. (C. E.) Temps universel coordonné (UTC), ajusté à l'heure locale.

si votre fuseau horaire est PST, comme moi la date sera en fait 31/12/1600. Pour obtenir autour de ceci et écrire du code plus robuste que vous pourriez considérer quelque chose comme ceci:

.OrderByDescending(f => f.LastWriteTime.Year <= 1601 ? f.CreationTime : f.LastWriteTime)
3
répondu ProVega 2014-05-24 02:25:00
la source

cela convertira le résultat en une classe lisible par l'objet SSIS:

var directory = Dts.Variables["User::SourceDir"].Value.ToString();
DirectoryInfo directoryInfo = new DirectoryInfo(directory);
var result = directoryInfo.GetFiles("*.xml", SearchOption.AllDirectories).OrderBy(t => t.LastWriteTime).ToList();
DataTable dsSorted = new DataTable();

DataColumn dc = new DataColumn("Value");
dsSorted.Columns.Add(dc);
foreach (FileInfo item in result)
{
    DataRow dr = dsSorted.NewRow();
    dr[0] = directory  + item ;
    dsSorted.Rows.Add(dr);
}

// lastModified = file.LastWriteTime;
Dts.Variables["User::FileNamesSorted"].Value = dsSorted;

// MessageBox.Show(Dts.Variables["User::FileNamesSorted"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
0
répondu PanLondon 2017-08-25 23:03:04
la source

Voici une solution que j'ai trouvée à partir de MSDN Social.

DirectoryInfo di = new DirectoryInfo(@"c:\my-directory");
FileInfo[] files = di.GetFiles(@"*.*");
Array.Sort(files, (x, y) => Comparer<DateTime>.Default.Compare(x.LastWriteTime, y.LastWriteTime)
0
répondu Tony 2018-08-29 01:06:59
la source

Autres questions sur