我有这样的路径......“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))
任何人都会对此有所帮助..... 非常感谢提前...
答案 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对象:
正如您所看到的那些共享相同的创建日期(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方法中。
请记住,if条件是基于创建时间的,因此您将看到不属于那里的文件名(如日期9/11/2010的文件名)。 (再一次,我昨天创建了所有这些文件,而日期为04/04/2011的文件是我从4月份发现的旧文件,并将其放在要测试的文件夹中。)
在这两张图片中,您会看到添加了1个文件,根据您看到返回gg集合的SS up top是有意义的。在该SS中,唯一不属于昨天创建日期的文件是2011年7月4日之后的文件,这就是为什么当我选择“1年”时它出现的原因。
答案 1 :(得分:1)
DateTime.Parse(argument)参数类型为String
,File.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);