2016-04-27 95 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 - 部分天数) –

+0

@KenWhite它不是重复的。另一个问题是基于文件创建时间,而这个问题是关于date-in-in-filename。 –

回答

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缓解说明:最好的和有效的选择是第一个,你需要做的是分配文件名作为日期时间 创建文件(如果它是在你的控制下),使事情 变得更容易

+0

可能要使用CreationTime.Date和DateTime.Now.Date,除非你想删除所有文件:) – gnalck

+0

@gnalck:谢谢你,很好的地方。我已经更新了答案 –

+0

感谢您的回复:) 我在找的文件名比创建时间多。 – ASN

1

你可以采取字符串的名称并做一个DateTime.ParseExact。

String dateString = Path.GetFileNameWithoutExtension(fileArray[i]) 
DateTime d5 = DateTime.ParseExact(dateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None) 
if (d5.Date < DateTime.Now.Date) 
{ 
    File.Delete(fileArray[i]); 
} 

这将采取字符串的前8个字符和解析做一个确切的解析。 你也许只想要没有路径和扩展名的文件名。

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

+0

如果创建日期是您想要比较的日期,其他答案可能会更好,但如果文件名中的日期为你想要什么,而不是实际的创建日期,然后解析字符串中的日期更好。 – Arina

+0

嗨阿里娜..我试过你的方法。但它是抛出一个错误.. “字符串未被识别为有效的日期时间。” 获取文件名后,我做到了这一点。 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

文件名已经在基于日期可排序格式。为什么不根据今天的日期创建一个文件名,而是将文件名数组过滤到只比字符串比较少的文件名 - 比你今天的日期文件名少?对于大文件列表,这可能比对每个文件名进行日期解析要快得多。

例如:

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