2010-11-11 4 views
2

У меня просто возник вопрос о написании функции, которая будет искать в каталоге самый последний журнал в каталоге. В настоящее время я придумал один, но мне интересно, есть ли лучший (возможно, более правильный) способ сделать это.Groovy прочитал последний файл в каталоге

В настоящее время я использую hdsentinel для создания журналов на компьютере и размещения журнала в каталоге. Журналы сохраняются так:

/directory/hdsentinel-computername-date 

ie. C:/hdsentinel-owner-2010-11-11.txt 

Так что я написал небольшой скрипт, который петли через определенные переменные для проверки самых последних (в течение прошлой недели), но после того, глядя на него, я вопрос, насколько эффективно и Правильно это делать так.

Вот сценарий:

String directoryPath = "D:" 
def computerName = InetAddress.getLocalHost().hostName 
def dateToday = new Date() 
def dateToString = String.format('%tm-%<td-%<tY', dateToday) 
def fileExtension = ".txt" 
def theFile 


for(int i = 0; i < 7; i++) { 
    dateToString = String.format('%tY-%<tm-%<td', dateToday.minus(i)) 
    fileName = "$directoryPath\\hdsentinel-$computerName-$dateToString$fileExtension" 

    theFile = new File(fileName) 

    if(theFile.exists()) { 
     println fileName 
     break; 
    } else { 
     println "Couldn't find the file: " + fileName 
    } 
} 

theFile.eachLine { print it } 

Скрипт прекрасно работает, возможно, она имеет некоторые недостатки. Я чувствовал, что должен пойти дальше и спросить, какой типичный маршрут для этого типа вещей, прежде чем я продолжу его.

Все данные оцениваются.

ответ

5

Хотя немного неаккуратно, можно реализовать несколькими столбцами то с помощью метода «GroupBy» (Излагая по коду Аарона) ..

def today = new Date() 
def recent = {file -> today - new Date(file.lastModified()) < 7} 

new File('/yourDirectory/').listFiles().toList() 
.findAll(recent) 
.groupBy{it.name.split('-')[1]} 
.collect{owner, logs -> logs.sort{a,b -> a.lastModified() <=> b.lastModified()} } 
.flatten() 
.each{ println "${new Date(it.lastModified())} ${it.name}" } 

Это находит все журналы, созданные в течение последней недели, группирует их по имени владельца, а затем сортирует по дате изменения.

Если у вас есть файлы, отличные от журналов в каталоге, вам может понадобиться grep для файлов, содержащих 'hdsentinel.'

Надеюсь, это поможет.

EDIT: Из примера вы предоставили, я не могу определить, если наименьшая значащая цифра в формате:

C: /hdsentinel-owner-2010-11-11.txt

представляет месяц или день. Если последний, сортировка по имени файла автоматически присваивает приоритет владельцу, а затем по дате, созданной (без всех ошибок в коде выше).

Например:

new File('/directory').listFiles().toList().findAll(recent).sort{it.name} 
+0

+1, Это «groovy» (то есть, не читается), и он даже соответствует оригинальному «присваиванию по примеру» (который был изменен на более позднем этапе). o) - Добро пожаловать в Stackoverflow, BTW! - SCNR – robbbert

+0

Очень приятно, мне пришлось несколько раз пересмотреть это, пытаясь понять, как это работает. У меня есть небольшие проблемы, просто получившие последнее изменение для имени владельца. Где вы его распечатываете, я вместо этого проверяю, есть ли (it.toString(). Contains (имя_компьютера)), однако это все еще представляет мне все файлы под этим именем компьютера. Есть ли способ получить самое последнее? У меня возникли проблемы с возможностью сравнить их по какой-то причине. – StartingGroovy

+1

У вас есть несколько вариантов для достижения этой цели. Предоставляемый мной код группируется владельцем и создает отсортированный список журналов для каждого. Таким образом, удаление «.flatten()» приведет к списку отсортированных списков. При этом вы можете просто использовать .first() или .last(), чтобы получить максимальную/последнюю информацию. Другая возможность заключается в том, чтобы заменить этот вид в целом, и вместо этого использовать «мин» или «макс». Например: «logs.min {log -> log.lastModified()}». Если вам нужен только один результат на одного владельца, вам действительно не нужно беспокоиться о организации по дате. – Northover

3

Надеюсь, это поможет некоторым .. Это сортирует заданный путь по дате, измененному более привлекательным образом. Вычисляет их.

вы можете ограничить список и добавить другие условия закрытия, чтобы получить желаемые результаты

new File('/').listFiles().sort() { 
    a,b -> a.lastModified().compareTo b.lastModified() 
}.each { 
    println it.lastModified() + " " + it.name 
} 
+0

Я изначально избегал «lastModified» из-за наличия нескольких имен компьютеров. Вы говорите, что я могу добавить условия в закрытие, как бы отсортировать файлы на основе имени компьютера, а затем даты? – StartingGroovy

1

Как я пытался решить подобную проблему, узнал гораздо более чистый подход.

Определение укупорочное для сортировки

def fileSortCondition = { it.lastModified() } 

и файла.listFiles() имеет другую вариацию, которая принимает файлы FileFilter и FilenameFilter в Java, и эти интерфейсы имеют один метод, называемый accept, реализуют интерфейс как закрытие.

def fileNameFilter = { dir, filename -> 
if(filename.matches(regrx)) 
    return true 
else 
    return false 
} as FilenameFilter 

И наконец

new File("C:\\Log_Dir").listFiles(fileNameFilter).sort(fileSortCondition).reverse() 

Реализовать интерфейс FileFilter, если фильтрация должна осуществляться по атрибутам файлов.

def fileFilter = { file -> 
     if(file.isDirectory()) 
      return false 
     else 
      return true } as FileFilter 
Смежные вопросы