Получить измененный файл в Linux с помощью Java на openSUSE Leap?

#java #linux

#java #linux

Вопрос:

мне нужен подход с Java, чтобы программа знала, когда файл в Linux был изменен. Я пробовал Files.getLastModifiedTime(), BasicFileAttributes и LastModified. К сожалению, это не сработало.

Сценарии

Сценарий A:

  • пустой текстовый файл копируется из папки A в B.
  • затем тот же самый пустой текстовый файл в редактируемом файле и написано что-то вроде «Привет, мир !!!» в редакторе, а затем скопируйте этот файл снова в папку B.

Сценарий B:

  • пустой текстовый файл копируется из папки A в B.
  • затем тот же самый пустой текстовый файл снова копируется в папку B.

* В сценарии A моя Java-программа идентифицирует измененный файл в папке B. Я использую временную метку в (дд.ММ.гггг ЧЧ: мм: СС), чтобы придать ему некоторую уникальную идентификацию, когда я связываю эту временную метку с его именем файла в виде строк.

* Но в сценарии B моя Java-программа идентифицирует этот файл также измененным, хотя в этом текстовом файле не было никаких изменений, он тот же и пустой в папке B. Я не знаю, какой атрибут использовать в Java, чтобы программа знала, что этот файл не был изменен.(Это случилось со мной только в Linux)

Я использую openSUSE Leap для среды Linux и Java OpenJDK 1.8 для своей программы.

При запуске этой программы я скопирую 2 существующих файла из «/ tmp / testfolder» в «/ tmp / testfolder / AFolder» с помощью команды Linux cp. Мне кажется, что openSUSE Leap не сохраняет последние измененные данные в своих файлах, потому что я получаю новую и ту же временную метку для значений в папке A и папке B. Этого не происходит в Linux Mint. К сожалению, моя компания использует openSUSE Leap:(

Мой код:

  package com.company;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.LinkOption;
    
    import org.apache.commons.io.FileUtils;
    
    public class App 
    {
        public static void main( String[] args ) 
        {
            File textFile1 = new File("/tmp/testfolder/TextFile1.txt");
            File textFile2 = new File("/tmp/testfolder/TextFile2.txt");
            File textFile1CopyInA = new File("/tmp/testfolder/AFolder/TextFile1.txt");
            File textFile2CopyInA = new File("/tmp/testfolder/AFolder/TextFile2.txt");
            File textFile1CopyInB = new File("/tmp/testfolder/BFolder/TextFile1.txt");
            File textFile2CopyInB = new File("/tmp/testfolder/BFolder/TextFile2.txt");
            File bfolder = new File("/tmp/testfolder/BFolder/");    
            try {
                System.out.println("Last Modified of File at testFolder"   textFile1.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile1.toPath(), LinkOption.NOFOLLOW_LINKS));
                System.out.println("Last Modified of File at testFolder"   textFile2.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile2.toPath(), LinkOption.NOFOLLOW_LINKS));
                
                    BufferedWriter writer = new BufferedWriter(new FileWriter(textFile1));
                    String data = "Hello World!!!";
                    writer.write(data);
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            
            
            while(true) {
                
                if((textFile1CopyInA.exists())amp;amp;(textFile2CopyInA.exists())){
                    try {
                        System.out.println("Last Modified of File in A"   textFile1CopyInA.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile1CopyInA.toPath(), LinkOption.NOFOLLOW_LINKS));
                        System.out.println("Last Modified of File in A"   textFile2CopyInA.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile2CopyInA.toPath(), LinkOption.NOFOLLOW_LINKS));
                        FileUtils.copyFileToDirectory(textFile1CopyInA, bfolder);
                        FileUtils.copyFileToDirectory(textFile2CopyInA, bfolder);
                    } catch (IOException e) {
                    e.printStackTrace();
                    }
                }
                
                if((textFile1CopyInB.exists())amp;amp;(textFile2CopyInB.exists())){
                    try {
                        System.out.println("Last Modified of File in B "   textFile1CopyInB.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile1CopyInB.toPath(), LinkOption.NOFOLLOW_LINKS));
                        System.out.println("Last Modified of File in B"   textFile2CopyInB.getAbsolutePath()   " :: "   Files.getLastModifiedTime(textFile2CopyInB.toPath(), LinkOption.NOFOLLOW_LINKS));
                    } catch (IOException e) {
                    e.printStackTrace();
                    }
                }
                
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
            
            
        }
    }
  

Заранее большое спасибо!!

Комментарии:

1. Я не думаю, что вы можете отслеживать это с помощью атрибутов файла. Атрибуты файла не отслеживают содержимое файла. Они отслеживают только информацию о «метаданных» файла, например, когда был изменен файл. Копирование одного файла поверх другого является модификацией первого. Это просто совпадение, если содержимое файла не меняется. Если вы хотите проверить, изменилось ли содержимое файла, вам нужно использовать что-то еще, кроме атрибутов. Одним из вариантов было бы отслеживать контрольную сумму MD5 файла, например.

2. Большое вам спасибо!!! это полностью решило мою проблему. Я использовал эту контрольную сумму по этой ссылке: howtodoinjava.com/java/io/sha-md5-file-checksum-hash и добавьте его в мой проект, это сработало!!!