|
@@ -136,8 +136,17 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
|
|
|
SERIAL_ECHOPGM("Access date: ");
|
|
|
MYSERIAL.println(p.lastAccessDate);
|
|
|
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;
|
|
|
if (match != NULL) {
|
|
|
if (strcasecmp(match, filename) == 0) return;
|
|
@@ -773,8 +782,8 @@ void CardReader::presort() {
|
|
|
// retaining only two filenames at a time. This is very
|
|
|
// slow but is safest and uses minimal RAM.
|
|
|
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
|
|
|
position = 0;
|
|
@@ -800,8 +809,8 @@ void CardReader::presort() {
|
|
|
#else
|
|
|
// Copy filenames into the static array
|
|
|
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
|
|
|
strcpy(sortshort[i], filename);
|
|
|
#endif
|
|
@@ -830,8 +839,8 @@ void CardReader::presort() {
|
|
|
(modification_date[o1] < modification_date [o2]))
|
|
|
#else
|
|
|
#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
|
|
|
|
|
@@ -882,8 +891,8 @@ void CardReader::presort() {
|
|
|
counter++;
|
|
|
getfilename_simple(positions[o1]);
|
|
|
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
|
|
|
bool dir1 = filenameIsDir;
|
|
|
#endif
|