2016-03-21 4 views
1

フォルダにないファイル番号を特定する必要があります。フォルダ内に見つからないファイル番号を検索するコード

私は以下のコード使用してファイル名を取得しています

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

をしかし、今取得した後、私は両方含ま1から1976までのファイルの範囲から欠落しているファイルの数である見つける必要があります。

+0

ファイル名でソートし、インクリメントして比較します。 – Panther

+0

ファイルの名前は1,2、...? –

答えて

2

ファイル名だけが必要な場合は、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); 
    } 
} 

しかし、あなたが本当に確認する必要がある場合は、ファイルがあることではない、例えば、ディレクトリ、私はあなたのあなたのファイル名の構造、および「両方とあなたの心に正確にわからないんだけど

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。しかし、接頭辞と接尾辞を知っている必要があります(そしてそれは一意でなければなりません)。もしあなたがそうするならば、 'list()'の代わりに 'list(FilenameFilter)'を使用して、 xxx_ [0-9] +。txt "? –

+0

@JulienLopezうん、あなたはそうだ、答えにそれを追加する –

+0

私のファイルがabcde-1 _Transformed.xmlの形式であれば今や。それから、私はどのように混乱していくのですか? –

-1

:それをするもう一つの方法は、単にすべてのiためFile Sを作成し、その存在を確認することで、あります含まれています "。それが私の考えです。私はそれがあなたのために少し助けてくれることを願っています。

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の原則をご存知ですか? (そしてそれが2000年の業務にどのように適用されるか) –

+0

@DmitryGinzburg:申し訳ありませんが、私の解決策とあなたの解決策との間には全く異なるものがありますか?コメントの前に激しくお読みになり、誰かを恥じるようにしてください。 –

+0

はい、私は知っている、何が違うのですか。あなたのソリューションは長く、読みにくく、多分3倍高速です(3msではなく1ms)。 –

関連する問題