eon
eon

Reputation: 67

Detecting the last folder from a list

I have several files, thing is that i need to know which one was the last created according to the numbers I give them automatically.

For example if i have: file1, file2, file3 I want to receive the file3. I can't do this with "last modified" because I have other folders and files in the same directory.

Also to this last file I would like to increment his number in 1.

Upvotes: 0

Views: 109

Answers (4)

Alexis C.
Alexis C.

Reputation: 93842

Ok, here's an alternative. I'm assuming that the file name is known and they have the same name.

public static void main(String[] args) {
        File dir = new File("directory of the files");
        File [] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.startsWith("folder");
            }
        });
        for (File file : files) {
            System.out.println(file.getName());
        }
        System.out.println("---------");
        List<File> myFile = new ArrayList<>(Arrays.asList(files));
        Collections.sort(myFile, new Comparator<File>() {

            @Override
            public int compare(File f1, File f2) {
                // TODO Auto-generated method stub
                int numberF1 = Integer.parseInt(f1.getName().replace("folder",""));
                int numberF2 = Integer.parseInt(f2.getName().replace("folder",""));
                return Integer.compare(numberF1, numberF2);
            }
        });

        for (File file : myFile) {
            System.out.println(file.getName());
        }
    }

Output :

folder10
folder2
folder20
folder250
---------
folder2
folder10
folder20
folder250

Upvotes: 0

Coder
Coder

Reputation: 490

Here is an alternate simple solution.

import java.io.File;

public class FileUtility {

    private static final String FOLDER_PAHT = "D:\\Test";
    private static final String FILE_PREFIX = "file";
    /**
     * @param args
     */
    public static void main(String[] args) {
        int lastFileNumber = getLastFileNumber();
        System.out.println("In folder " + FOLDER_PAHT + " last file is " + FILE_PREFIX + lastFileNumber);
        if(incrementFileNumber(lastFileNumber)) {
            System.out.println("After incrementing the last file becomes : FILE_PREFIX" + lastFileNumber + 1);
        } else {
            System.out.println("Some error occured while updating file number.");
        }

    }

    private static int getLastFileNumber(){
        int maxFileNumber = 0;
        File folder = new File(FOLDER_PAHT);
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
            String fileName = listOfFiles[i].getName();
            if (listOfFiles[i].isFile() && fileName.contains(FILE_PREFIX)) {
                try {
                    int fileNumber = Integer.parseInt(fileName.substring(FILE_PREFIX.length(), fileName.indexOf(".")));
                    if(maxFileNumber < fileNumber) {
                        maxFileNumber = fileNumber;
                    }
                } catch (NumberFormatException e) {
                    // Because there can be files with starting name as FILE_PREFIX but not valid integer appended to them.
                    //NOthing to do
                }
            } 
        }
        return maxFileNumber;
    }

    private static boolean incrementFileNumber(final int oldNumber) {
        File oldfile =new File(FOLDER_PAHT + File.separator + FILE_PREFIX + oldNumber);
        File newfile =new File(FOLDER_PAHT + File.separator + FILE_PREFIX + (oldNumber + 1) + ".txt");
        return oldfile.renameTo(newfile);
    }
}

Upvotes: 1

Andrea Ligios
Andrea Ligios

Reputation: 50203

    public static void main (String[] args) throws Exception
    {
         File    foldersContainer  = new File("c:/test");
         String  latestFileName    = "";
         Integer highestFileNumber = 0;

         for (File tmpFile : foldersContainer.listFiles()){
             if (tmpFile.isFolder()) {
                int currentNumber = extractFileNumber(tmpFile.getName());
                if (currentNumber > highestFileNumber){
                   highestFileNumber = currentNumber;
                   latestFileName    = tmpFile.getName();
                }
             }
         }             
         latestFileName.replace(highestFileNumber.toString(),
                                (++highestFileNumber).toString());
         System.out.println("Latest file (incremented): " + latestFileName);
    }


    private static int extractFileNumber(String name){          
        for (int x=name.length()-1; x >= 0; x--) 
            if (!Character.isDigit(name.charAt(x))) 
                return Integer.parseInt(name.substring(x+1));
        return -1;
    }

If the filename before the last number can contain numbers, then you should use lastIndexOf to be sure of finding only the occurrence you really want to increment.

instead of

latestFileName.replace(highestFileNumber.toString(),
                       (++highestFileNumber).toString());

you should use

latestFileName = latestFileName
     .substring(0,latestFileName.lastIndexOf(highestFileNumber.toString()))
     .concat((++highestFileNumber).toString());

Upvotes: 0

Viktor Mellgren
Viktor Mellgren

Reputation: 4506

Put the files in a list and sort it lexically, then take the last one.

Ofcourse you have to filter out the ones you are looking for with regex or contains/startswith/endswith

Upvotes: 2

Related Questions