2016-04-27 5 views
1

У меня есть файлы в формате "yyyyMMdd_hhmmss_abc.txt" в определенном месте. , используя приведенный ниже код, я могу получить все файлы с «_abc.txt» в этой папке.Удалить файлы, которые старше сегодняшней даты

fileArray = Directory.GetFiles(@"C://Documents", "*abc.txt"); 
for (int i = 0; i < fileArray.Length; i++) 
{ 
    fileArray[i] = Path.GetFileNameWithoutExtension(fileArray[i]); 
    Console.WriteLine(fileArray[i]); 
} 

Но теперь я думаю чтения имя файла, разбить его, а затем преобразовать в объект времени даты, так что я могу проверить условие (старше сегодняшнего дня) и удалить их.

for eg: 20160426_045823_abc.txt 

Я хочу, чтобы разбить его на 2016, 04, 26, а затем преобразовать в дату времени объекта с помощью Datetime d1 = new Datetime(2016,04,26), а затем выполнять другие операции.

Есть ли другой способ решить эту проблему?

Заранее спасибо

+0

Возможный дубликат [Удаление файлов, которые старше, чем некоторое количество дней] (http://stackoverflow.com/questions/1720790/removing-files-that-are-older -than-some-number-of-days) –

+0

@KenWhite Это не дубликат. Этот другой вопрос основан на времени создания файла, и этот вопрос относится к дате-встроенному в имя файла. –

ответ

0

Вы можете получить DateTime файл был создан, как этот

DateTime time = File.GetCreationTime(fileName); 

Да, это так просто.

+0

привет JSON. Когда я пробовал этот код, почему он показывает дату 1/1/1601 8:00:00 AM. Есть что-то еще, что мне нужно сделать/ – ASN

+0

Ваше имя файла, вероятно, неверно. Убедитесь, что вы включили весь путь. Если вам нравится мой ответ, ответьте и удари меня – JSON

2

Следующий код может быть использован для получения набора файлов, имеющих созданную дату меньше текущей даты, простой итерации по коллекции поможет вам удалить их, а также: рассмотрим код

Простой вариант:

foreach (var item in Directory.GetFiles(@"C://Documents", "*.txt") 
           .Where(x => new FileInfo(x).CreationTime.Date < DateTime.Now.Date)) 
{ 
    File.Delete(item); 
} 

на основе Имя файла:

var fileArray = Directory.GetFiles(@"C://Documents", "*abc.txt"); 
for (int i = 0; i < fileArray.Length; i++) 
{ 
    DateTime fileNameTime; 
    string fileName = Path.GetFileNameWithoutExtension(fileArray[i]).Replace("_abc", " "); 
    fileNameTime = DateTime.ParseExact("yyyyMMdd_hhmmss", fileName, CultureInfo.InvariantCulture, DateTimeStyles.None); 
    if (fileNameTime.Date < DateTime.Now.Date) 
    { 
     File.Delete(fileArray[i]); 
    } 
} 

Pl легкость: Лучший и эффективный вариант - первый, вам нужно назначить имя файла как dateTime во время создания файла (если он находится под вашим контролем), чтобы вещи стало легче для вас

+0

Возможно, вы хотите использовать CreationTime.Date и DateTime.Now.Date, если вы не хотите удалять все файлы :) – gnalck

+0

@gnalck: thankk you, nice spot. я обновил ответ –

+0

Спасибо за ответ :) Я ищу имя файла больше, чем время творения. – ASN

1

Вы можете взять имя строки и выполнить DateTime.ParseExact.

Это займет первые 8 символов строки и синтаксический разбор на нем. Также вы, вероятно, просто захотите указать имя файла без пути и расширения.

https://msdn.microsoft.com/en-us/library/w2sa9yss%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

+0

Если дата создания - это дата, которую вы хотите сравнить, другие ответы, вероятно, лучше, но если дата в имени файла то, что вы хотите, а не фактическая дата создания, а затем лучше разбирать дату с строки. – Arina

+0

Привет, Арина .. Я попробовал ваш метод. но он выдает ошибку. «Строка не была признана действительной DateTime». После получения имен файлов я сделал это. DateTime d5 = DateTime.ParseExact ("yyyyMMdd", fileArray [i], CultureInfo.InvariantCulture, DateTimeStyles.None); Console.WriteLine (d5); – ASN

+0

Возможно, вам придется обрезать имя файла, чтобы получить его в точном формате. DateTime d5 = DateTime.ParseExact ("yyyyMMdd", fileArray [i] .SubString (0, 8), CultureInfo.InvariantCulture, DateTimeStyles.None) – Arina

2

Имя файла уже в формате сортируемого на основе даты. Вместо того, чтобы разбирать биты имени файла в объект DateTime, почему бы не создать имя файла на основе сегодняшней даты и не фильтровать свой массив имен файлов до тех, которые являются строковыми сравнениями меньше, чем имя вашего сегодняшнего имени? Это, вероятно, немного быстрее, чем синтаксический анализ даты для каждого имени файла, для больших списков файлов.

Например:

var path = "c:\\whatever"; 
var suffix = "_abc.txt"; 
var todaysFilename = DateTime.Now.ToString("yyyyMMdd_hhmmss") + suffix; 
var filesToDelete = Directory.EnumerateFiles(path, "*" + suffix) 
    .Select(Path.GetFileName) 
    .Where(fileName => string.Compare(fileName, todaysFilename, StringComparison.Ordinal) < 0) 
    .ToArray(); 

foreach (var file in filesToDelete) 
{ 
    File.Delete(Path.Combine(path, file)); 
} 
+0

Спасибо за ответ. Что делать, если мне нужно удалить файлы, которые на 5 дней старше сегодняшней даты? Это 5 вместо 0 в вашем коде? – ASN

+0

Нет, функция «Сравнить» возвращает значение меньше нуля, когда первый аргумент меньше, ноль, когда они равны, и значение больше нуля, когда второй аргумент меньше. Вы хотите сделать следующее: 'var todayFilename = DateTime.Now.AddDays (-5) .ToString (...)'. Это приведет к удалению всех файлов старше 5 дней. –

+0

спасибо .. попробует это :) – ASN

Смежные вопросы