2016-03-21 18 views
1

Bir klasörde eksik olan dosya numaralarını tanımlamam gerekir.Klasörde eksik dosya numaralarını bulma kodu

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()); 
    } 
} 

Ama şimdi aldıktan sonra ben her iki dahil 1-1976 bir dosya aralığından eksik dosya numarası olan bulmalıyız:

Ben aşağıdaki kodu kullanarak dosyaları isimleri geri alabildim.

+0

Dosya adına göre sıralayın ve art arda sıralayarak bunları karşılaştırın. – Panther

+0

Yani dosyalarınız 1, 2, ... olarak adlandırıldı mı? –

cevap

2

Sadece dosya adlarına ihtiyacınız varsa, list() yöntemini kullanabilirsiniz. Bu yöntemle tüm dosya adlarını almak sonra, tıpkı, belirtilen dosya adları varlığını kontrol edebilirsiniz:

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); 
    } 
} 

Ama gerçekten kontrol etmek gerekiyorsa, dosya olduğunu değil, örneğin, dizin, Ben senin dosya adının yapısal ve "hem aklında tam olarak emin değilim

for (int i = 1; i <= 1976; ++i) { 
    File file = new File(parent, prefix + i + suffix); 

    if (!file.isFile()) { 
     System.out.format("File #%d doesn't exist or is directory%n", i); 
    } 
} 
+0

+1. Ama önek ve sonek (ve benzersiz olması gerekir) bilmeniz gerekir ve eğer yaparsanız, liste (FilenameFilter) 'yerine' liste() 'yerine sadece eşleşen dosyaları tutmak için kullanmak daha iyi olmaz mı? xxx_ [0-9] +. txt "? –

+0

@JulienLopez yep, haklısınız, cevabı –

+0

'a ekleyeceğim Şimdi eğer dosyam abcde-1 _Transformed.xml biçimindeyse. Öyleyse nasıl karıştırılmalıyım ..? –

-1

: bunu yapmak için bir yol daha adil her i için File s oluşturma ve varlığını kontrol ederek, orada dahil". Bu benim fikrim, umarım senin için biraz yardımcı olurum.

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); 
} 
+0

KISS prensibini biliyor musunuz? (ve 2000 operasyonları için nasıl geçerlidir) –

+0

@DmitryGinzburg: Üzgünüm, ama çözümüm ve çözümünüz arasında tam olarak ne olduğunu biliyor musunuz ??? Yorum yapmadan önce sert okumaya çalışın ve birisinin onuruna bakmaya çalışın –

+0

Evet, farklı olanı biliyorum. Çözümünüz daha uzun, okumak daha zor ve (belki) 3 kat daha hızlı (3 ms yerine 1 ms) –