|  | @@ -136,8 +136,17 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
 | 
												
													
														
															|  |  						SERIAL_ECHOPGM("Access date: ");
 |  |  						SERIAL_ECHOPGM("Access date: ");
 | 
												
													
														
															|  |  						MYSERIAL.println(p.lastAccessDate);
 |  |  						MYSERIAL.println(p.lastAccessDate);
 | 
												
													
														
															|  |  						SERIAL_ECHOLNPGM("");*/
 |  |  						SERIAL_ECHOLNPGM("");*/
 | 
												
													
														
															|  | -						modificationDate = p.lastWriteDate;
 |  | 
 | 
												
													
														
															|  | -						modificationTime = p.lastWriteTime;
 |  | 
 | 
												
													
														
															|  | 
 |  | +						crmodDate = p.lastWriteDate;
 | 
												
													
														
															|  | 
 |  | +						crmodTime = p.lastWriteTime;
 | 
												
													
														
															|  | 
 |  | +						// There are scenarios when simple modification time is not enough (on MS Windows)
 | 
												
													
														
															|  | 
 |  | +						// For example - extract an old g-code from an archive onto the SD card.
 | 
												
													
														
															|  | 
 |  | +						// In such case the creation time is current time (which is correct), but the modification time
 | 
												
													
														
															|  | 
 |  | +						// stays the same - i.e. old.
 | 
												
													
														
															|  | 
 |  | +						// Therefore let's pick the most recent timestamp from both creation and modification timestamps
 | 
												
													
														
															|  | 
 |  | +						if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){
 | 
												
													
														
															|  | 
 |  | +							crmodDate = p.creationDate;
 | 
												
													
														
															|  | 
 |  | +							crmodTime = p.creationTime;
 | 
												
													
														
															|  | 
 |  | +						}
 | 
												
													
														
															|  |  						//writeDate = p.lastAccessDate;
 |  |  						//writeDate = p.lastAccessDate;
 | 
												
													
														
															|  |  						if (match != NULL) {
 |  |  						if (match != NULL) {
 | 
												
													
														
															|  |  							if (strcasecmp(match, filename) == 0) return;
 |  |  							if (strcasecmp(match, filename) == 0) return;
 | 
												
											
												
													
														
															|  | @@ -773,8 +782,8 @@ void CardReader::presort() {
 | 
												
													
														
															|  |  		// retaining only two filenames at a time. This is very
 |  |  		// retaining only two filenames at a time. This is very
 | 
												
													
														
															|  |  		// slow but is safest and uses minimal RAM.
 |  |  		// slow but is safest and uses minimal RAM.
 | 
												
													
														
															|  |  		char name1[LONG_FILENAME_LENGTH + 1];
 |  |  		char name1[LONG_FILENAME_LENGTH + 1];
 | 
												
													
														
															|  | -		uint16_t modification_time_bckp;
 |  | 
 | 
												
													
														
															|  | -		uint16_t modification_date_bckp;
 |  | 
 | 
												
													
														
															|  | 
 |  | +		uint16_t crmod_time_bckp;
 | 
												
													
														
															|  | 
 |  | +		uint16_t crmod_date_bckp;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  		#endif
 |  |  		#endif
 | 
												
													
														
															|  |  		position = 0;
 |  |  		position = 0;
 | 
												
											
												
													
														
															|  | @@ -800,8 +809,8 @@ void CardReader::presort() {
 | 
												
													
														
															|  |  				#else
 |  |  				#else
 | 
												
													
														
															|  |  				// Copy filenames into the static array
 |  |  				// Copy filenames into the static array
 | 
												
													
														
															|  |  				strcpy(sortnames[i], LONGEST_FILENAME);
 |  |  				strcpy(sortnames[i], LONGEST_FILENAME);
 | 
												
													
														
															|  | -				modification_time[i] = modificationTime;
 |  | 
 | 
												
													
														
															|  | -				modification_date[i] = modificationDate;
 |  | 
 | 
												
													
														
															|  | 
 |  | +				modification_time[i] = crmodTime;
 | 
												
													
														
															|  | 
 |  | +				modification_date[i] = crmodDate;
 | 
												
													
														
															|  |  				#if SDSORT_CACHE_NAMES
 |  |  				#if SDSORT_CACHE_NAMES
 | 
												
													
														
															|  |  				strcpy(sortshort[i], filename);
 |  |  				strcpy(sortshort[i], filename);
 | 
												
													
														
															|  |  				#endif
 |  |  				#endif
 | 
												
											
												
													
														
															|  | @@ -830,8 +839,8 @@ void CardReader::presort() {
 | 
												
													
														
															|  |  																	(modification_date[o1] < modification_date [o2]))
 |  |  																	(modification_date[o1] < modification_date [o2]))
 | 
												
													
														
															|  |  			#else
 |  |  			#else
 | 
												
													
														
															|  |  			#define _SORT_CMP_NODIR() (strcasecmp(name1, name2) > 0) //true if lowercase(name1) > lowercase(name2)
 |  |  			#define _SORT_CMP_NODIR() (strcasecmp(name1, name2) > 0) //true if lowercase(name1) > lowercase(name2)
 | 
												
													
														
															|  | -			#define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp > modificationTime)) || \
 |  | 
 | 
												
													
														
															|  | -																	(modification_date_bckp > modificationDate))
 |  | 
 | 
												
													
														
															|  | 
 |  | +			#define _SORT_CMP_TIME_NODIR() (((crmod_date_bckp == crmodDate) && (crmod_time_bckp > crmodTime)) || \
 | 
												
													
														
															|  | 
 |  | +																	(crmod_date_bckp > crmodDate))
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  			#endif
 |  |  			#endif
 | 
												
													
														
															|  |  
 |  |  
 | 
												
											
												
													
														
															|  | @@ -882,8 +891,8 @@ void CardReader::presort() {
 | 
												
													
														
															|  |  					counter++;
 |  |  					counter++;
 | 
												
													
														
															|  |  					getfilename_simple(positions[o1]);
 |  |  					getfilename_simple(positions[o1]);
 | 
												
													
														
															|  |  					strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it)
 |  |  					strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it)
 | 
												
													
														
															|  | -					modification_date_bckp = modificationDate;
 |  | 
 | 
												
													
														
															|  | -					modification_time_bckp = modificationTime;
 |  | 
 | 
												
													
														
															|  | 
 |  | +					crmod_date_bckp = crmodDate;
 | 
												
													
														
															|  | 
 |  | +					crmod_time_bckp = crmodTime;
 | 
												
													
														
															|  |  					#if HAS_FOLDER_SORTING
 |  |  					#if HAS_FOLDER_SORTING
 | 
												
													
														
															|  |  					bool dir1 = filenameIsDir;
 |  |  					bool dir1 = filenameIsDir;
 | 
												
													
														
															|  |  					#endif
 |  |  					#endif
 |