Graeme Cooper Ответов: 2

Может ли кто-нибудь объяснить, почему мой код удаляется без разбора?


Привет, я довольно новичок в linq, и я решил сделать программу, которая принимает каталог файлов, читает расширение файла и возраст целевого файла(ов). Основная цель состоит в том, чтобы просто удалить файлы с помощью расширения файла, но нацелиться только на старые файлы(1 неделя, 3 месяца или более).

Я протестировал winform, в котором находится оператор linq для старых файлов, однако он, похоже, не может отличить старое от нового(конечно, я создал резервную копию для этих файлов на случай, если что-то пойдет ужасно неправильно).

Любая помощь будет очень признательна и извините за представление кода ниже, так как он принял другую форму после копирования и вставки.

Что я уже пробовал:

protected void log()
        {
           
            string path = fileLocation.Text;
            string fullPath = string.Format(@"{0}\File_Deletion_Log.txt", path);
            File.AppendAllLines(fullPath, new[] {"File Deletion Complete    " + string.Format("{0:yyyy-MM-dd}   ",DateTime.Now) + string.Format("Files Deleted: {0}",Count)});
            Count = 0;
        }
        protected void button1_Click(object sender, EventArgs e)
        {   
                string extensions = fileExtension.Text;

                    var files = new DirectoryInfo(fileLocation.Text).GetFiles("*", SearchOption.AllDirectories)
                                     .Select(p => new FileInfo(Convert.ToString(p)))
                                     .Where(p => p.CreationTime < DateTime.Now.Subtract(TimeSpan.FromDays(Convert.ToInt32(fileAge.Text))))
                                     .Where(p => string.Compare(p.Extension, extensions, true) == 0);
                    foreach (var file in files)
                    {
                        file.Attributes = FileAttributes.Normal;
                        File.Delete(file.FullName);
                        Count++;
                    }
                    MessageBox.Show(string.Format("Total Number of files deleted:   {0}", Count));
                    log();

2 Ответов

Рейтинг:
2

megaadam

Не совсем понятно, где ваш fileAge исходит от но вы могли бы попробовать TimeSpan.FromDays(90) чтобы сузить круг проблем. И пропустите удаление во время отладки. Просто распечатайте имена файлов.


Graeme Cooper

Жаль, fileAge.Текст-это пользовательский ввод.
родословная.Текст: сколько лет вашему файлу, который вы хотите удалить, или другой способ сказать удалить файлы, которые старше x дней.

Рейтинг:
17

OriginalGriff

Без ваших файлов для тестирования мы вообще ничего не сможем сделать - так что начните с "разбиения" Linq на отдельные операторы:

var files = new DirectoryInfo(fileLocation.Text).GetFiles("*", SearchOption.AllDirectories);
var selected = files.Select(p => new FileInfo(Convert.ToString(p))).ToList();
DateTime limit = DateTime.Now.Subtract(TimeSpan.FromDays(Convert.ToInt32(fileAge.Text)));
var where = selected.Where(p => p.CreationTime < limit).ToList();
var where2 = where.Where(p => string.Compare(p.Extension, extensions, true) == 0).ToList();
Затем вы можете пошагово просмотреть каждый этап процесса, чтобы точно увидеть, что обрабатывается и какие результаты вы получаете.

Надеюсь, это даст вам некоторую информацию о том, где находится проблема.


Graeme Cooper

Спасибо, я более тщательно изучил его вместе с другом, чтобы найти свою логику немного назад в разделе limit/fileAge оператора linq.

OriginalGriff

Всегда пожалуйста!