Java 用于查找文件夹中缺少的文件编号的代码

Java 用于查找文件夹中缺少的文件编号的代码,java,file,Java,File,我需要确定文件夹中缺少的文件编号 我已使用以下代码检索文件名: File folder = new File(FILE_PATH); File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { System.out.println("File " + listOfFiles[i].getN

我需要确定文件夹中缺少的文件编号

我已使用以下代码检索文件名:

File folder = new File(FILE_PATH);
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        System.out.println("File " + listOfFiles[i].getName());
    } else if (listOfFiles[i].isDirectory()) {
        System.out.println("Directory " + listOfFiles[i].getName());
    }
 }
File folder=新文件(文件路径);
File[]listOfFiles=folder.listFiles();
for(int i=0;i

但是现在,在检索之后,我需要找到在1-1976的文件范围内丢失的文件号。

如果您只需要文件名,可以使用
list()
方法。使用此方法获取所有文件名后,只需检查指定文件名是否存在,如:

File parent = ...
String prefix = "xxx_", suffix = ".txt"; // for example

Set<String> files = new HashSet<>(Arrays.asList(parent.list()));

// or, as suggested by @JulienLopez:

String pattern = Pattern.quote(prefix) + "\\d+" + Pattern.quote(suffix);
Set<String> files = new HashSet<>(Arrays.asList(parent.list((dir, file) -> file.matches(pattern))));

for (int i = 1; i <= 1976; ++i) { // actually constant should be used
    if (!files.contains(prefix + i + suffix)) {
        System.out.format("File #%d doesn't exist%n", i);
    }
}

我不确定你的文件名的结构,也不确定你对“包含两个”的确切想法。这是我的想法,希望对你有点帮助

String FILE_PREFIX= "your_file_prefix"; // Your file prefix. If your file is "logfile_on_20160121_0001" then the prefix is "logfile_on_20160121_"
int RANGE_MIN = 1;
int RANGE_MAX = 1976;
int fileList[] = new int[RANGE_MAX];
int directoryList[] = new int[RANGE_MAX];

// Quote your code with a bit modify from me
File folder = new File(FILE_PATH);
File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
      if (listOfFiles[i].isFile()) {
        System.out.println("File " + listOfFiles[i].getName());
        // Added started
        String tempSplitedName[] = listOfFiles[i].split(FILE_PREFIX);
        if(tempSplitedName.length==2){
            int seq = Integer.parseInt(tempSplitedName[2]);
            if(seq>=RANGE_MIN && seq<=RANGE_MAX){
                fileList[seq] = 1;
            }
        }
        // Added ended
      } else if (listOfFiles[i].isDirectory()) {
        System.out.println("Directory " + listOfFiles[i].getName());
        // Added started
        String tempSplitedName[] = listOfFiles[i].split(FILE_PREFIX);
        if(tempSplitedName.length==2){
            int seq = Integer.parseInt(tempSplitedName[2]);
            if(seq>=RANGE_MIN && seq<=RANGE_MAX){
                directoryList[seq] = 1;
            }
        }
        // Added ended
      }

// Now you count missing files/directory, which is equal 0
for (int i=RANGE_MIN; i<=RANGE_MAX; i++){
    if(fileList[i]==0) System.out.println("Missing file No." + i);
}
for (int i=RANGE_MIN; i<=RANGE_MAX; i++){
    if(directoryList[i]==0) System.out.println("Missing directory No." + i);
}
String FILE\u PREFIX=“您的\u FILE\u PREFIX”//您的文件前缀。如果您的文件是“logfile_on_20160121_0001”,则前缀是“logfile_on_20160121_”
int RANGE_MIN=1;
int范围_MAX=1976;
int fileList[]=新的int[RANGE_MAX];
int directoryList[]=新的int[RANGE_MAX];
//从我这里引用你的代码并稍加修改
文件夹=新文件(文件路径);
File[]listOfFiles=folder.listFiles();
for(int i=0;i如果(seq>=RANGE\u MIN&&seq=RANGE\u MIN&&seq)按文件名排序并递增比较。因此文件名为1,2,…?+1。但是您需要知道前缀和后缀(并且必须是唯一的),如果这样做,是否最好使用
list(FilenameFilter)
而不是
list()
来只保留匹配的文件“xxx_[0-9]+.txt”@JulienLopez是的,你说得对,如果我的文件是abcde-1 Transformed.xml格式的,我会把它添加到答案中。那我怎么会感到困惑呢?这里的父项与所有文件所在的路径有关吗?@Rhino0419使用正确的
prefix=“abcde-”
后缀=”_Transformed.xml“
父目录是我们获取所有文件的目录。您知道KISS原则吗?(以及它如何应用于2000操作)@DmitryGinzburg:对不起,但是你知道我的解决方案和你的解决方案有什么不同吗???在评论和羞辱他人之前努力阅读。是的,我知道,有什么不同。你的解决方案更长,更难阅读,而且(可能)快3倍(1毫秒而不是3毫秒)@康宏:好吧,他的解决方案是编译好的,对初学者来说是有效的。@JulienLopez:事实恰恰相反,DmitryGinzburg建议的代码更容易阅读。主要的不同在于算法的复杂性。
String FILE_PREFIX= "your_file_prefix"; // Your file prefix. If your file is "logfile_on_20160121_0001" then the prefix is "logfile_on_20160121_"
int RANGE_MIN = 1;
int RANGE_MAX = 1976;
int fileList[] = new int[RANGE_MAX];
int directoryList[] = new int[RANGE_MAX];

// Quote your code with a bit modify from me
File folder = new File(FILE_PATH);
File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
      if (listOfFiles[i].isFile()) {
        System.out.println("File " + listOfFiles[i].getName());
        // Added started
        String tempSplitedName[] = listOfFiles[i].split(FILE_PREFIX);
        if(tempSplitedName.length==2){
            int seq = Integer.parseInt(tempSplitedName[2]);
            if(seq>=RANGE_MIN && seq<=RANGE_MAX){
                fileList[seq] = 1;
            }
        }
        // Added ended
      } else if (listOfFiles[i].isDirectory()) {
        System.out.println("Directory " + listOfFiles[i].getName());
        // Added started
        String tempSplitedName[] = listOfFiles[i].split(FILE_PREFIX);
        if(tempSplitedName.length==2){
            int seq = Integer.parseInt(tempSplitedName[2]);
            if(seq>=RANGE_MIN && seq<=RANGE_MAX){
                directoryList[seq] = 1;
            }
        }
        // Added ended
      }

// Now you count missing files/directory, which is equal 0
for (int i=RANGE_MIN; i<=RANGE_MAX; i++){
    if(fileList[i]==0) System.out.println("Missing file No." + i);
}
for (int i=RANGE_MIN; i<=RANGE_MAX; i++){
    if(directoryList[i]==0) System.out.println("Missing directory No." + i);
}