2016-04-27 79 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

相關問題