Как получить последние файлы в C # - PullRequest
0 голосов
/ 04 мая 2010

У меня есть несколько файлов с тем же именем, но с разными датами. В основном мы находим файлы с самыми последними датами

Шаблоны файлов:

<FileNames><YYYYMMDD><FileExtension>

e.g. test_20100506.xls indicates

<FileNames> = test_
<YYYYMMDD> = 20100506
<FileExtension> = .xls

Теперь в исходной папке файлы

standardization_20100503.xls, standardization_20100504.xls, standardization_20100305.xls, replacement_20100505.xls

Как видно, standardization_.xls имеют 3 числа, но Замена_.xls только 1.

На выходе будет список имен файлов, содержимое которых будет

стандартизация_20100504.xls и замена_20100505.xls

Потому что среди всех стандартизация_.xls - самая последняя, ​​и замена_.xls также одинакова.

Я пытался по собственной логике, но как-то не получилось.

Моя идея как под

private static void GetLatestFiles(ref List<FileInfo> validFiles)
        {
            List<FileInfo> validFilesTemp = new List<FileInfo>();
            for (int i = 0; i < validFiles.Count; i++)
            {
                for (int j = i+1; j < validFiles.Count; j++)
                {
                    string getFileTextX = ExtractText(validFiles[i].Name);
                    string getFileTextY = ExtractText(validFiles[j].Name);
                    if (getFileTextX == getFileTextY)
                    {
                        int getFileDatesX = Convert.ToInt32(ExtractNumbers(validFiles[i].Name));
                        int getFileDatesY = Convert.ToInt32(ExtractNumbers(validFiles[j].Name));

                        if (getFileDatesX > getFileDatesY)
                        {
                            validFilesTemp.Add(validFiles[i]);
                        }
                        else
                        {
                            validFilesTemp.Add(validFiles[j]);
                        }
                    }
                }
            }

            validFiles.Clear();
            validFiles = validFilesTemp;
        }

Экстрактные номера:

public static string ExtractNumbers(string expr)
        {
            return string.Join(null, System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
        }

и ExtractText -

public static string ExtractText(string expr)
        {
            return string.Join(null, System.Text.RegularExpressions.Regex.Split(expr, "[\\d]"));
        }

Я использую c # 3.0 и framework 3.5

Ответы [ 2 ]

1 голос
/ 04 мая 2010

Используйте это регулярное выражение, чтобы получить дату из полного имени файла.

@"_([0-9]*)\."

Затем конвертируйте его в DateTime, если хотите, как

DateTime dt;
 dt = new DateTime();
 dt = DateTime.ParseExact(MyString, "yyyyMMdd",null);

Используйте dt.CompareTo(dt1).Equals(1) для сравнения, если дата раньше или позже.

0 голосов
/ 04 мая 2010
class Program
{
    static void Main()
    {
        var files =
            from file in Directory.GetFiles(@"c:\somedirectory")
            let name = Path.GetFileNameWithoutExtension(file)
            let tokens = name.Split('_')
            where tokens.Length > 1
            let date = DateTime.ParseExact(tokens[1], "yyyyMMdd", CultureInfo.InvariantCulture)
            orderby date descending
            select file;

        foreach (var item in files)
        {
            Console.WriteLine(item);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...