Ich würde gerne wissen (mit C #), wie ich Dateien in einem bestimmten Verzeichnis löschen kann, die älter als 3 Monate sind, aber ich denke, der Zeitraum könnte flexibel sein.
Um es klar zu sagen: Ich suche nach Dateien, die älter als 90 Tage sind, dh Dateien, die vor weniger als 90 Tagen erstellt wurden, sollten aufbewahrt werden, alle anderen sollten gelöscht werden.
So etwas tut es nicht.
using System.IO;
string[] files = Directory.GetFiles(dirName);
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
if (fi.LastAccessTime < DateTime.Now.AddMonths(-3))
fi.Delete();
}
Hier ist ein 1-Liner-Lambda:
Directory.GetFiles(dirName)
.Select(f => new FileInfo(f))
.Where(f => f.LastAccessTime < DateTime.Now.AddMonths(-3))
.ToList()
.ForEach(f => f.Delete());
Für diejenigen, die LINQ übermäßig nutzen möchten.
(from f in new DirectoryInfo("C:/Temp").GetFiles()
where f.CreationTime < DateTime.Now.Subtract(TimeSpan.FromDays(90))
select f
).ToList()
.ForEach(f => f.Delete());
Hier ist ein Ausschnitt, wie man die Erstellungszeit von Dateien im Verzeichnis erhält und die Dateien findet, die vor 3 Monaten erstellt wurden (vor 90 Tagen, um genau zu sein):
DirectoryInfo source = new DirectoryInfo(sourceDirectoryPath);
// Get info of each file into the directory
foreach (FileInfo fi in source.GetFiles())
{
var creationTime = fi.CreationTime;
if(creationTime < (DateTime.Now- new TimeSpan(90, 0, 0, 0)))
{
fi.Delete();
}
}
Die GetLastAccessTime -Eigenschaft in der System.IO.File-Klasse sollte helfen.
Grundsätzlich können Sie Directory.Getfiles (Path) verwenden, um eine Liste aller Dateien abzurufen. Danach durchlaufen Sie die Liste und rufen GetLastAccessTim () auf, wie Keith vorgeschlagen hat.
Private Sub DeleteZip ()
Dim eachFileInMydirectory As New DirectoryInfo("D:\Test\")
Dim fileName As IO.FileInfo
Try
For Each fileName In eachFileInMydirectory.GetFiles
If fileName.Extension.Equals("*.Zip") AndAlso (Now - fileName.CreationTime).Days > 90 Then
fileName.Delete()
End If
Next
Catch ex As Exception
WriteToLogFile("No Files older than 90 days exists be deleted " & ex.Message)
End Try
End Sub
Ich verwende Folgendes in einer Konsolen-App, die als Dienst ausgeführt wird, um Verzeichnisinformationen aus der App.Settings-Datei abzurufen. Die Anzahl der Tage, für die die Dateien aufbewahrt werden, ist ebenfalls konfigurierbar, multipliziert mit -1 für die Verwendung in der AddDays () - Methode von DateTime.Now.
static void CleanBackupFiles()
{
string gstrUncFolder = ConfigurationManager.AppSettings["DropFolderUNC"] + "";
int iDelAge = Convert.ToInt32(ConfigurationManager.AppSettings["NumDaysToKeepFiles"]) * -1;
string backupdir = string.Concat(@"\", "Backup", @"\");
string[] files = Directory.GetFiles(string.Concat(gstrUncFolder, backupdir));
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
if (fi.CreationTime < DateTime.Now.AddDays(iDelAge))
{
fi.Delete();
}
}
}
sie brauchen nur FileInfo -> CreationTime
und dann einfach die Zeitdifferenz berechnen.
in der app.config können Sie den TimeSpan - Wert speichern, wie alt die Datei sein muss, um gelöscht zu werden
schauen Sie sich auch die DateTime Subtract -Methode an.
viel Glück
Alternativ können Sie die Methode File.GetCreationTime verwenden, wenn Sie Dateien basierend auf dem Erstellungsdatum löschen möchten.
ich habe diesen Code ausprobiert und er funktioniert sehr gut, hoffe ich habe geantwortet
namespace EraseJunkFiles
{
class Program
{
static void Main(string[] args)
{
DirectoryInfo yourRootDir = new DirectoryInfo(@"C:\yourdirectory\");
foreach (FileInfo file in yourRootDir.GetFiles())
if (file.LastWriteTime < DateTime.Now.AddDays(-90))
file.Delete();
}
}
}
system.IO;
List<string> DeletePath = new List<string>();
DirectoryInfo info = new DirectoryInfo(Server.MapPath("~\\TempVideos"));
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
DateTime CreationTime = file.CreationTime;
double days = (DateTime.Now - CreationTime).TotalDays;
if (days > 7)
{
string delFullPath = file.DirectoryName + "\\" + file.Name;
DeletePath.Add(delFullPath);
}
}
foreach (var f in DeletePath)
{
if (File.Exists(F))
{
File.Delete(F);
}
}
verwendung beim Laden der Seite oder beim Webservice oder bei jeder anderen Verwendung.
Mein Konzept ist jeden 7. Tag, den ich Ordnerdatei löschen muss, ohne DB zu verwenden
Ein Beispiel vom Typ SSIS. (Falls dies jemandem hilft)
public void Main()
{
// TODO: Add your code here
// Author: Allan F 10th May 2019
//first part of process .. put any files of last Qtr (or older) in Archive area
//e.g. if today is 10May2019 then last quarter is 1Jan2019 to 31March2019 .. any files earlier than 31March2019 will be archived
//string SourceFileFolder = "\\\\adlsaasf11\\users$\\aford05\\Downloads\\stage\\";
string SourceFilesFolder = (string)Dts.Variables["SourceFilesFolder"].Value;
string ArchiveFolder = (string)Dts.Variables["ArchiveFolder"].Value;
string FilePattern = (string)Dts.Variables["FilePattern"].Value;
string[] files = Directory.GetFiles(SourceFilesFolder, FilePattern);
//DateTime date = new DateTime(2019, 2, 15);//commented out line .. just for testing the dates ..
DateTime date = DateTime.Now;
int quarterNumber = (date.Month - 1) / 3 + 1;
DateTime firstDayOfQuarter = new DateTime(date.Year, (quarterNumber - 1) * 3 + 1, 1);
DateTime lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);
DateTime LastDayOfPriorQuarter = firstDayOfQuarter.AddDays(-1);
int PrevQuarterNumber = (LastDayOfPriorQuarter.Month - 1) / 3 + 1;
DateTime firstDayOfLastQuarter = new DateTime(LastDayOfPriorQuarter.Year, (PrevQuarterNumber - 1) * 3 + 1, 1);
DateTime lastDayOfLastQuarter = firstDayOfLastQuarter.AddMonths(3).AddDays(-1);
//MessageBox.Show("debug pt2: firstDayOfQuarter" + firstDayOfQuarter.ToString("dd/MM/yyyy"));
//MessageBox.Show("debug pt2: firstDayOfLastQuarter" + firstDayOfLastQuarter.ToString("dd/MM/yyyy"));
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
//MessageBox.Show("debug pt2:" + fi.Name + " " + fi.CreationTime.ToString("dd/MM/yyyy HH:mm") + " " + fi.LastAccessTime.ToString("dd/MM/yyyy HH:mm") + " " + fi.LastWriteTime.ToString("dd/MM/yyyy HH:mm"));
if (fi.LastWriteTime < firstDayOfQuarter)
{
try
{
FileInfo fi2 = new FileInfo(ArchiveFolder);
//Ensure that the target does not exist.
//fi2.Delete();
//Copy the file.
fi.CopyTo(ArchiveFolder + fi.Name);
//Console.WriteLine("{0} was copied to {1}.", path, ArchiveFolder);
//Delete the old location file.
fi.Delete();
//Console.WriteLine("{0} was successfully deleted.", ArchiveFolder);
}
catch (Exception e)
{
//do nothing
//Console.WriteLine("The process failed: {0}", e.ToString());
}
}
}
//second part of process .. delete any files in Archive area dated earlier than last qtr ..
//e.g. if today is 10May2019 then last quarter is 1Jan2019 to 31March2019 .. any files earlier than 1Jan2019 will be deleted
string[] archivefiles = Directory.GetFiles(ArchiveFolder, FilePattern);
foreach (string archivefile in archivefiles)
{
FileInfo fi = new FileInfo(archivefile);
if (fi.LastWriteTime < firstDayOfLastQuarter )
{
try
{
fi.Delete();
}
catch (Exception e)
{
//do nothing
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
Zum Beispiel: Um zu meinem Ordnerprojekt auf Quelle zu gelangen, muss ich zwei Ordner hochgehen
public static void LimpiarArchivosViejos()
{
DayOfWeek today = DateTime.Today.DayOfWeek;
int hora = DateTime.Now.Hour;
if(today == DayOfWeek.Monday || today == DayOfWeek.Tuesday && hora < 12 && hora > 8)
{
CleanPdfOlds();
CleanExcelsOlds();
}
}
private static void CleanPdfOlds(){
string[] files = Directory.GetFiles("../../Users/Maxi/Source/Repos/13-12-2017_config_pdfListados/ApplicaAccWeb/Uploads/Reports");
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
if (fi.CreationTime < DateTime.Now.AddDays(-7))
fi.Delete();
}
}
private static void CleanExcelsOlds()
{
string[] files2 = Directory.GetFiles("../../Users/Maxi/Source/Repos/13-12-2017_config_pdfListados/ApplicaAccWeb/Uploads/Excels");
foreach (string file in files2)
{
FileInfo fi = new FileInfo(file);
if (fi.CreationTime < DateTime.Now.AddDays(-7))
fi.Delete();
}
}
//Store the number of days after which you want to delete the logs.
int Days = 30;
// Storing the path of the directory where the logs are stored.
String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\\Log(s)\\";
//Fetching all the folders.
String[] objSubDirectory = Directory.GetDirectories(DirPath);
//For each folder fetching all the files and matching with date given
foreach (String subdir in objSubDirectory)
{
//Getting the path of the folder
String strpath = Path.GetFullPath(subdir);
//Fetching all the files from the folder.
String[] strFiles = Directory.GetFiles(strpath);
foreach (string files in strFiles)
{
//For each file checking the creation date with the current date.
FileInfo objFile = new FileInfo(files);
if (objFile.CreationTime <= DateTime.Now.AddDays(-Days))
{
//Delete the file.
objFile.Delete();
}
}
//If folder contains no file then delete the folder also.
if (Directory.GetFiles(strpath).Length == 0)
{
DirectoryInfo objSubDir = new DirectoryInfo(subdir);
//Delete the folder.
objSubDir.Delete();
}
}
Sowas in der Art
foreach (FileInfo file in new DirectoryInfo("SomeFolder").GetFiles().Where(p => p.CreationTime < DateTime.Now.AddDays(-90)).ToArray())
File.Delete(file.FullName);