ошибка разбора при получении файла зависит от времени создания файла - PullRequest
0 голосов
/ 13 октября 2011

У меня есть такой путь ... "C: \ restore \ restoreb \"

По этому пути у меня есть такие файлы ...

 backup-2011-10-12T17-16-51.zip
 backup-2011-10-11T13-24-45.zip

У меня есть форма,в этой форме у меня есть список и выпадающий список (cbrestore). У меня есть элементы выпадающего списка, подобные этому ... Месяц, 3 месяца, 6 месяцев, год ...

что я хочу, если я выберуЭлемент комбинированного списка (месяц) Я хочу отобразить имена файлов, которые хранятся в этой папке между этими датами (с 12-10-2011 по 12-09-2011), используя время создания файла, то есть, как это .. File.Getcreationtime ..

Если я выберу элемент комбинированного списка (3 месяца), я хочу отобразить имена файлов, которые хранятся в этой папке между этими датами (с 12-10-2011 по 12-07-2011) .. в списке ..

Для этого я пробовал вот так ...

 List<String> t = Directory.GetFiles(@"C:\restore\restoredb\").ToList();
List<String> y = new List<string>();
List<String> u = new List<string>();



foreach (var zzz in t)
{
    y.Add(Path.GetFileName(zzz));
}


if (comboBox1.Text == "Month")
{
    u =
   (from String s in y where ((DateTime.Now.Month - (DateTime.Parse(File.GetCreationTime(s)) < 1) && (DateTime.Now.Year - DateTime.Parse(s.Substring(8, 10)).Year == 0) select s).
       ToList();
}

, но я получаю сообщение об ошибке, говорящее, что

"Лучший перегруженный метод соответствует system.datatime.parse (string) Имеет некоторые недопустимые аргументы .... вот так я получил ошибку в этой строке (DateTime.Parse(File.GetCreationTime(s))

Может ли кто-нибудь PLS помочь в этом ..... большое спасибо яN заранее ...

Ответы [ 4 ]

2 голосов
/ 13 октября 2011

Мне кажется, мне нужно было внести некоторые дополнительные изменения в код, который вы использовали.Ниже приведен новый код для comboBox:

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        List<Files> yourNewList = Files.GetFiles();

        List<String> u = new List<string>();


        if (comboBox1.Text == "Month")
        {
            u = (from Files f in yourNewList
                 where DateTime.Parse(f.CreationDate.Substring(0, 10)) > DateTime.Now.AddMonths(-1)
                 select f.FileName).ToList();
        }
        else if (comboBox1.Text == "3 Month")
        {
            u = (from Files f in yourNewList
                 where DateTime.Parse(f.CreationDate.Substring(0, 10)) > DateTime.Now.AddMonths(-3)
                 select f.FileName).ToList();
        }
        else if (comboBox1.Text == "1 Year")
        {
            u = (from Files f in yourNewList
                 where DateTime.Parse(f.CreationDate.Substring(0, 10)) > DateTime.Now.AddMonths(-12)
                 select f.FileName).ToList();
        }

        listBox1.DataSource = u;
    }

Используется созданный мной класс, который хранит объекты File, имеющие как имя файла, так и дату / время создания:

enter image description here

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

Сам класс использует этот код:

public class Files
{
    public string FileName { get; private set; }
    public string CreationDate { get; private set; }

    public List<Files> theseFiles
    {
        get
        {
            return GetFiles();
        }
    }

    public Files(string fileName, string creationDate)
    {
        this.FileName = fileName;
        this.CreationDate = creationDate;
    }


    public static List<Files> GetFiles()
    {
        //Gets full file names
        List<String> t = Directory.GetFiles(@"C:\Users\justin\Desktop\New folder (2)\").ToList();
        List<String> t2 = new List<string>();
        foreach (var yyy in t)
        {
            t2.Add(Path.GetFileName(yyy));
        }

        //Creation Dates

        var dirInfo = new DirectoryInfo(@"C:\Users\justin\Desktop\New folder (2)");
        List<String> fct = (from f in dirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)

                            select f.CreationTime.Date.ToShortDateString()).ToList();

        List<String> y = new List<string>();
        foreach (var zzz in fct)
        {
            y.Add(zzz);
        }

        //Creats a collection of the file objects for you to use
        List<Files> gg = new List<Files>();


        for (int x = 0; x < t2.Count(); x++)
        {
            //Adjusts the dates to add 0's in the off chance that they aren't there
            if(DateTime.Parse(y[x]).Month < 10)
            {
                y[x] = "0" + y[x];
            }
            if(DateTime.Parse(y[x]).Day < 10)
            {
                y[x] = y[x].Insert(3, "0");
            }
            Files thefile = new Files(t2[x].ToString(), y[x].ToString());
            gg.Add(thefile);

        }

        return gg;

    }

    public override string ToString()
    {
        return string.Format("{0} , {1}", FileName, this.CreationDate);
    }
}

Все, что вам нужно сделать, это добавить класс в ваш проект под названием Filesи вставьте этот код внутрь.(Убедитесь, что вы изменили каталог в классе, поскольку он в данный момент указывает на мою папку)

Затем вставьте код сверху вниз в метод SelectedIndexChanged на странице .cs вашей формы.

enter image description here

Помните, условные операторы if основаны на времени создания, поэтому вы увидите имена файлов (например, с датой 9/11/2010), которые там не принадлежат.(Еще раз я создал все эти файлы вчера, и тот, который имеет дату от 04/04/2011, является более старым zip-файлом, который я нашел в апреле, и поместил его в папку для тестирования).

enter image description here

На двух рисунках вы видите добавление 1 файла, который имеет смысл, основываясь на верхней части SS, где вы видите коллекцию return gg.В этом SS единственный файл, который выходит за пределы вчерашней даты создания, - это файл от 04/04/2011, поэтому он появляется, когда я выбираю «1 год».

1 голос
/ 13 октября 2011

DateTime.Parse (аргумент) тип аргумента String и File.GetCreationTime (аргумент) возвращает DateTime, поэтому вы пытаетесь передать значение DateTime в качестве аргумента типа String

Так что просто измените условие, как показано ниже:

where ((DateTime.Now.Month - File.GetCreationTime(s).Month) < 1) 
       && 
       (DateTime.Now.Year - DateTime.Parse(s.Substring(8, 10)).Year == 0)

РЕДАКТИРОВАТЬ:

Чтобы проверить, является ли месяц создания файла предыдущим, я бы предложил использовать что-то вроде этого:

DateTime now = DateTime.Now;
DateTime fileCreationTime = File.GetCreationTime(s);

bool isPreviousMonth = (DateTime.Now.Month == 1 ? 12 : DateTime.Now.Month - 1) 
                       ==   fileCreationTime.Month;

EDIT2:

string path = @"C:\restore\restoredb\";            
IList<String> allFiles = Directory.GetFiles(path).ToList();
IList<String> fileNames = new List<string>();
IList<String> filesCreatedInThisMonth = new List<string>();
fileNames = allFiles.Select(filePath => Path.GetFileName(filePath)).ToList();

if (comboBox1.Text == "Month")
{
    filesCreatedInThisMonth =
        allFiles.Where(fileName =>
                {
                    return File.GetCreationTime(fileName).Month
                            == (DateTime.Now.Month == 1 ? 12 : DateTime.Now.Month - 1)
                            &&
                            (DateTime.Now.Year == DateTime.Parse(fileName.Substring(8, 10)).Year);
                }).ToList();
 }

EDIT3:

IList<String> filesCreatedInThisMonth = new List<string>();
IList<String> fileNames = new List<string>();
// Key - Full file path
// Value - File creation DateTime extracted from the file name
IDictionary<string, DateTime> filePathToDateMap =
    Directory.GetFiles(path).ToDictionary(
        filePath => filePath,
        filePath => DateTime.Parse(Path.GetFileName(filePath).Substring(8, 10)));

// mapEntry - KeyValuePair
// Key - filePath, Value - creation DateTime extracted from the file name
filesCreatedInThisMonth =
        filePathToDateMap.Where(mapEntry =>
                {
                    return File.GetCreationTime(mapEntry.Key).Month
                            == (DateTime.Now.Month == 1 ? 12 : DateTime.Now.Month - 1)
                            &&
                            (DateTime.Now.Year == mapEntry.Value.Year);
                }).Select(entry => entry.Key)
                .ToList();           

ИЛИ Случай, когда время создания файла не извлекается изимя файла, но из реального времени создания:

IDictionary<string, DateTime> filePathToDateMap =
Directory.GetFiles(path).ToDictionary(
    filePath => filePath,
    filePath => File.GetCreationTime(filePath));
0 голосов
/ 13 октября 2011

В вашем примере кода вы используете время создания файла с помощью File.GetCreationTime для сравнения месяцев, но вы используете то, что кажется временем создания файла, встроенным в имя файла (начиная с индекса 7), чтобы проверитьгод.Примечание: Substring(int, int) использует индексирование с нуля, поэтому ваш код должен использовать Substring(7, 10) Vice Substring(8, 10), который будет отключен на единицу.

Если допустимо использование даты, встроенной в имя файла (по сравнению сметка времени из операционной системы), тогда будут получены все имена файлов, созданные за предыдущий месяц:

string path = @"C:\restore\restoredb\";
IList<String> allFiles = Directory.GetFiles(path).ToList();
IList<String> fileNames = allFiles.Select(filePath => Path.GetFileName(filePath)).ToList();     

List<String> filesCreatedInLastMonth = new List<string>();
DateTime endDate = DateTime.Now;
DateTime beginDate = endDate.AddMonths(-1);
foreach (var fileName in fileNames)
{
    DateTime dt = DateTime.Parse(fileName.Substring(7, 10));
    if ((beginDate <= dt) && (dt <= endDate))
    {
        filesCreatedInLastMonth.Add(fileName);
    }
}

Это можно легко изменить для других диапазонов дат.

Для использования файлавместо этого время создания измените первую строку внутри блока foreach на:

DateTime dt = File.GetCreationTime(path + fileName);
0 голосов
/ 13 октября 2011

Ваша ошибка здесь:

(DateTime.Parse(File.GetCreationTime(s))

File.GetCreationTime (s) возвращает DateTime, а не строку (тип, который DateTime.Parse ожидает ...)

Вы должнызаменить предыдущий код для File.GetCreationTime (s) без DateTime.Parse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...