获取文件时解析错误取决于文件创建时间

时间:2011-10-13 13:09:05

标签: c# .net winforms file

我有这样的路径......“C:\ restore \ restoredb \”

在那条路上我有这样的文件..

 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个月)我想显示这些日期之间(2011年10月12日至12月12日)存储在该文件夹中的文件名..在列表框中..

为此,我试过这样......

 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的最佳重载方法匹配(字符串)有一些无效的参数.... 像这样我在此行(DateTime.Parse(File.GetCreationTime(s))

出错了

任何人都会对此有所帮助..... 非常感谢提前...

4 个答案:

答案 0 :(得分:2)

我似乎需要对您一直使用的代码进行一些其他更改。下面是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

正如您所看到的那些共享相同的创建日期(4月份的那个是我发现使用的旧zip文件),这是因为我昨天制作了这些文件来帮助您。我无法欺骗窗口从文件中提取的创建日期。

该类本身使用此代码:

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的类,并将该代码粘贴到其中。 (确保更改类中的目录,因为它当前指向我的文件夹)

然后将代码从顶部粘贴到表单的.cs页面中的SelectedIndexChanged方法中。

enter image description here

请记住,if条件是基于创建时间的,因此您将看到不属于那里的文件名(如日期9/11/2010的文件名)。 (再一次,我昨天创建了所有这些文件,而日期为04/04/2011的文件是我从4月份发现的旧文件,并将其放在要测试的文件夹中。)

enter image description here

在这两张图片中,您会看到添加了1个文件,根据您看到返回gg集合的SS up top是有意义的。在该SS中,唯一不属于昨天创建日期的文件是2011年7月4日之后的文件,这就是为什么当我选择“1年”时它出现的原因。

答案 1 :(得分:1)

DateTime.Parse(argument)参数类型为StringFile.GetCreationTime(argument)返回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();           

OR不从文件名中检索文件创建时间但从实际创建时间检索的情况:

IDictionary<string, DateTime> filePathToDateMap =
Directory.GetFiles(path).ToDictionary(
    filePath => filePath,
    filePath => File.GetCreationTime(filePath));

答案 2 :(得分:0)

您的错误在这里:

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

File.GetCreationTime(s)返回DateTime,而不是字符串(DateTime.Parse期望的类型......)

你应该在没有DateTime.Parse的情况下替换File.GetCreationTime的先前代码

答案 3 :(得分:0)

在您的示例代码中,您通过File.GetCreationTime使用文件创建时间进行月份比较,但您正在使用嵌入在文件名中的文件创建时间(从索引7开始)检查这一年。附注:Substring(int, int)使用从零开始的索引编制,因此您的代码应该使用Substring(7, 10)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);