Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare using File.lastmodified in java

Tags:

java

file

I need to compare the last modified time stamps from two locations. If they dont match, I need to copy file from first location to second and also set the modified time stamp of second with that of the first.

I am trying this with File.lastModified in java. But I am getting different values of File.lastModified for the same file at different times even though they are not being modified. Please note that am trying this in linux.

Can anyone point whats going wrong ?

Thanks

Copying the code :

/**
 * Copies files from Source to Destination Directory
 *
 * @param src Source Directory
 * @param destFolder Destination Directory
 * @param existingROOTNames Existing ROOT files
 * @return boolean flag to indicate whether root context has changed
 */
private static boolean copyFiles(File src, File destFolder, String[] existingROOTNames) {
    final String[] fileNames = src.list();
    boolean changeRootContext = false;
    File srcFile = null;
    File destFile = null;
    List rootFileList = Arrays.asList(existingROOTNames);
    int rootFileIndex = -1;
    long srcFileTime;
    long destFileTime;
    for (int index = 0; index < fileNames.length; index++) {

        srcFile = new File(src, fileNames[index]);
        destFile = new File(destFolder.getPath(),fileNames[index]);

        if (srcFile.isFile()) {
            if (log.isEnabled(DEBUG)) {
                log.debug("copy file : " + srcFile);
            }
            srcFileTime = srcFile.lastModified();
            destFileTime = destFile.lastModified();
            if(hasFileChanged(srcFileTime,destFileTime)){
                changeRootContext = true;
                if (log.isEnabled(XDEBUG)) {
                    log.debug(XDEBUG,"changing flag to true for : " + srcFile);
                    log.debug(XDEBUG,"changing flag srcFile.lastModified() : " + srcFileTime);
                    log.debug(XDEBUG,"changing flag destFile.lastModified() : " + destFileTime);
            }
            }
            try {
                FileUtil.fastChannelCopy(srcFile.getPath(), destFolder.getPath());
                log.debug("changing flag while modifying destFile.lastModified() : " + destFile.setLastModified(srcFileTime));
                log.debug("changing flag after modifying destFile.lastModified() : " + destFile.lastModified());
                rootFileIndex = rootFileList.indexOf(fileNames[index]);
                if(rootFileIndex!=-1){
                    existingROOTNames[rootFileIndex]=null;
                }

            } catch (IOException e) {
                log.debug("unable to copy source file : "
                        + fileNames[index], e);
            }
        }
    }
    return changeRootContext;
}


/**
 * Checks whether the provided timestamp matches or not
 * This is required as in linux the time is approximated to nearest milliseconds
 *
 * @param srcFileTime
 * @param destFileTime
 * @return whether matched or not
 */
private static boolean hasFileChanged(long srcFileTime, long destFileTime){
    return Math.abs(srcFileTime-destFileTime) > 1000l;
} 
like image 468
Ishita Avatar asked Dec 13 '11 10:12

Ishita


1 Answers

Can you be sure that there are not processes accessing the file? Try with fuser -k /path/to/your/filename to kill any process that could be accessing the test files.

like image 94
chech0x Avatar answered Sep 25 '22 06:09

chech0x