У меня есть каталог со следующими именами файлов:
01.02.2010.txt
02.02.2010.txt
03.02.2010.txt
04.02.2010.txt
Я прочитал названия файлов без их расширения:
fs.readdir('./files', function (err, items) {
items.forEach(function (file) {
console.info(file.slice(0,-5))
});
});
я хочу удалить два последних файла с наименьшей датой из каталога.
у вас есть идеи, как это сделать с node.js, спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В основном это просто размышления.
У вас формат mm.dd.yyyy.txt.
Теперь мы можем написать быструю функцию для сравнения двух дат:
// Assume f1, f2 are filenames
function compareDates(f1, f2) {
var d1 = f1.split("."),
d2 = f2.split(".");
var temp;
temp = d1[2];
d1[2] = d1[1];
d1[1] = temp;
temp = d2[2];
d2[2] = d2[1];
d2[1] = temp;
for (var i = 2; i >= 0; i--) {
if (parseInt(d1[i]) < parseInt(d2[i]))
return f1;
else if (parseInt(d1[i]) > parseInt(d2[i]))
return f2;
}
return f1;
}
Эта функция примет на вход два имени файла и выведет имя файла с более ранней датой. Когда у вас есть эта функция, вы можете просто просмотреть свой список следующим образом:
var earliest = [items[0], items[1]];
var index = 0;
if (compareDates(items[0], items[1]) == items[1])
index++;
items.forEach(function(file) {
if (compareDates(earliest[index], file) == file) {
earliest[index] = file;
if (compareDates(earliest[index], earliest[!index]) == earliest[!index])
index = !index;
}
});
На этом этапе массив earliest будет содержать два имени файла с самыми ранними датами. Надеюсь, это помогло!
Обновлено: Как сказал другой, вы можете удалить фактический файл следующим образом:
fs.unlink(filename, function(err) {
if (err)
throw err;
console.info(`${filename} deleted.`);
});
Я генерирую дату для каждого файла в списке переменных files на основе имени файла, который уже содержит дату. Имея даты в переменных dates, я сортирую все даты, потому что список файлов может быть в неправильном порядке. После сортировки дат я извлекаю только первые два элемента в массивах дат и генерирую имена файлов на основе дат и сохраняю имена файлов в переменной filesNames.
var files =["04.02.2010.txt","01.02.2010.txt","03.02.2010.txt", "02.02.2010.txt"];
// Loop through the list of file and generate date corresponding to the name of each file
var dates = []
files.forEach(function(date){
var matches = date.match(/^(.+)\.txt$/);
var dateTxt = matches[1].split('.');
var fileDate = new Date(dateTxt[2], dateTxt[1], dateTxt[0]);
dates.push(fileDate);
});
// Sort list of dates
dates.sort(function (date1, date2) {
return date1 - date2
});
// Get the 2 lowest dates
var datesToDeletes = dates.slice(0,2);
// Regenerates filesnames
var filesNames = []
datesToDeletes.forEach(function(d){
var date = d.getDate()
// Add 0 before date if the month has only one number
date = (String(date).length == 1)? "0" + date : date;
var month = d.getMonth()
// Add 0 before month if the month has only one number
month = (String(month).length == 1)? "0" + month : month;
var year = d.getFullYear();
var dateString = date + '.' + month + '.' + year;
var fileName = dateString + '.txt';
filesNames.push(fileName);
})
// Deletes files
filesNames.forEach(function(file){
var path = "" + file;
// I put console log just for debugging purpose
console.info(path)
// Delete each file
// Here you can delete the file because you have the name of the file in the path variable
/*
fs.unlink(path, (err) => {
throw err;
});
*/
})