List of files by creation time
BlitzMax Forums/BlitzMax Programming/List of files by creation time| 
 | ||
| I'm looking for a way to load a list of files in a folder, and then sort them by creation time. Last modified time would be ok too. My intention is to delete a certain number of old files in the folder every now and again. | 
| 
 | ||
| FileTime returns an integer : "The time the file at path was last modified" Does anybody know how to interpret this number? Here's an example: C:\BlitzMax = 1294508154 What does that mean? | 
| 
 | ||
| Its the time/datestamp in unix format (the number of seconds since 1st January 1970). Try this. | 
| 
 | ||
| Some rounding is used 32-bit signed integer = 2147483647 seconds 35791394 minutes 596523 hours 24855 days 68 years 2011-1970 = 41 years 68 - 41 = 27 years So in 27 years, it won't work anymore in BlitzMax. Is that right? Thanks for the link, it could be useful. Last edited 2011 | 
| 
 | ||
| Probably, but I'll be too old to care by then. | 
| 
 | ||
| The UNIX timestamp  overflows at 03:14:07 UTC 2038-01-19. All 32-bit Unix/Linux systems are affected by this as well, but it's a non-issue for 64-bit operating systems and applications. | 
| 
 | ||
| Why do people create these systems!!!  Probably, but I'll be too old to care by then.  I guess that explains it. | 
| 
 | ||
| FileSize does not work on folders. Is there an alternative? Other than summing the sizes of all files myself. | 
| 
 | ||
| Here is my solution. Somewhat tested. Private
Type TFileRecord Final
	Field name:String
	Field time:Int
	Field size:Long
	
	Function Create:TFileRecord(name:String, time:Int, size:Long)
		Local record:TFileRecord = New TFileRecord
		record.name = name
		record.time = time
		record.size = size
		Return record
	End Function
	
	Function CompareByTime:Int(o1:Object, o2:Object)
		Local f1:TFileRecord = TFileRecord(o1)
		Local f2:TFileRecord = TFileRecord(o2)
		Assert f1 And f2
		'a greater time means the file is YOUNGER
		If f1.time < f2.time Then Return 1
		If f1.time > f2.time Then Return -1
		Return 0
	End Function
End Type
Public
Function trim_logs(size:Long)
	Local files:String[] = LoadDir("Logs")
	Local records:TList = New TList
	Local size_sum:Long = 0
	
	'scan all files and store their name, size and time
	For Local file:String = EachIn files
		Local path:String = "Logs\" + file
		If Not (FileType(path) = FILETYPE_FILE) Then Continue 	
		Local size = FileSize(path)
		size_sum :+ size
		Local time = FileTime(path)
		records.AddLast(TFileRecord.Create(file, time, size))
	Next
	
	'sort according to age
	records.Sort(True, TFileRecord.CompareByTime)
	
	'the latest record should never be deleted, regardless of size
	records.RemoveFirst()
	
	'delete records starting from oldest, until trim size is reached
	While size_sum > size And Not records.IsEmpty()
		Local record:TFileRecord = TFileRecord(records.RemoveLast())
		DeleteFile "Logs\" + record.name
		size_sum :- record.size
	WEnd
End FunctionLast edited 2011 |