2010-11-19 15 views
1

Bazı kod ive çevrimiçi bulundu ve filechooser yoluyla seçilen birden klasöre bakmak ayak uydurduk varjava dosyası ile birden fazla dizinleri klasör boyutunu almak []

public long getFolderSize(File[] selectedDirectories) { 
long foldersize = 0; 

for(int i = 0; i < selectedDirectories.length; i++){ 
    File[] currentFolder = selectedDirectories[i].listFiles(); 

    for (int q = 0; q < currentFolder.length; q++) { 
    if (currentFolder[q].isDirectory()) { 
    //if folder run self on q'th folder - in which case the files.length will be counted for the files inside 
    foldersize += getFolderSize(currentFolder[q]);//<<the error is here 
    } else { 
    //else get file size 
    foldersize += currentFolder[q].length(); 
    } 
    } 
return foldersize; 
} 

} hata olan

:

getFolderSize(currentFolder[q]) 

im onun kullanılarak Dosya ve [] Dosya ama

cevap

0

Sadece varargs için diziden imza değiştirin:

public static long getgFolderSize(final File... selectedDirectories){ 
    long foldersize = 0; 
    for(final File item : selectedDirectories){ 
     for(final File subItem : item.listFiles()){ 
      if(subItem.isDirectory()){ 
       foldersize += getFolderSize(subItem); 
      } else{ 
       foldersize += subItem.length(); 
      } 
     } 
    } 
    return foldersize; 
} 

Şimdi bir veya daha fazla Dosyalarla veya dosyaları bir dizi yöntemini çağırabilirsiniz.

Test kodu: (Ayrıca, her ikisi de varargs kullanıp kullanmadığınızı aynı şekilde çalıştığını görebilirsiniz, eğer ana dizininiz 5 alt klasörden daha azsa başarısız olur).

public static void main(final String[] args) throws Exception{ 
    final File homeFolder = new File(System.getProperty("user.home")); 
    final File[] subFolders = homeFolder.listFiles(new FileFilter(){ 

     private int ct = 0; 

     @Override 
     public boolean accept(final File pathname){ 
      return pathname.isDirectory() && ct++ < 5; 
     } 
    }); 
    System.out.println("Folders to check:" + Arrays.toString(subFolders)); 
    long accumulated = 0l; 

    for(final File file : subFolders){ 
     accumulated += getFolderSize(file); 
    } 
    final long allAtOnce = getFolderSize(subFolders); 
    final long withVarArgs = 
     getFolderSize(subFolders[0], subFolders[1], subFolders[2], 
      subFolders[3], subFolders[4]); 
    System.out.println("Accumulated: " + accumulated); 
    System.out.println("All at once: " + allAtOnce); 
    System.out.println("With varargs: " + withVarArgs); 
} 

(tüm platformlarda çalışması gerekir, sizin ev dizininizde ilk 5 klasörlerin boyutunu hesaplar sizin ev dizininizde az beş klasör varsa bir ArrayIndexOutOfBoundException başarısız olur). Benim makinede

Çıktı:

Klasörler kontrol etmek: [/ home/seanizer/Ubuntu One,/home/seanizer/Belgeler, /home/seanizer/.java,/home/seanizer/.mozilla, /home/seanizer/.evolution] Birikmiş
: Hepsi birden 1245886955
: varargs ile 1245886955
: Genellikle 1245886955

+0

varargs bir dönüş türümün olmasına izin vermeyecek ve dahası çalışmıyor – slex

+0

Makinemde mükemmel çalışıyor. Şimdi eklediğim ana yöntemi kullanmayı deneyin. –

+0

Ve varargs, dönüş türü ile ilgisi yoktur. –

0
düzeltmek için nasıl takılıp im ima Çünkü

Uzunluğundan bir Dosya [] oluşturabilir ve sadece File nesnesini buna ekleyebilir, ardından bunu tekrarlayan çağrı için iletebilirsiniz. Bu, gördüğünüz hatayı düzeltecektir.

File[] tempArray = new File[1]; 
tempArray[0] = currentFolder[q]; 
foldersize += getFolderSize(tempArray); 
+0

Ne demek istediğinden emin değilsiniz – slex

+1

Dosya [] tempArray = new File [1]; tempArray [0] = currentFolder [q]; filesize + = getFolderSize (tempArray); – DaveJohnston

+0

Dave onu bana dövdü.Benim çözümüme ekleniyor. – Corv1nus

0

benim yöntemii yazmak ds onları belirli görevlere ayırmak isterim.

public long getFolderSize(File[] selectedDirectories) { 
    long foldersize = 0; 

    for(int i = 0; i < selectedDirectories.length; i++){ 
     folderSize += getFolderSize(selectedDirectories[i]); 
    } 
    return foldersize; 
} 

kolayca yeniden kullanabilirsiniz Bu şekilde:

public long getFolderSize(File directory) { 
    long foldersize = 0; 

    File[] currentFolder = directory.listFiles(); 

    for (int q = 0; q < currentFolder.length; q++) { 
     if (currentFolder[q].isDirectory()) { 
      //if folder run self on q'th folder - in which case the files.length will be counted for the files inside 
      foldersize += getFolderSize(currentFolder[q]); 
     } else { 
      //else get file size 
      foldersize += currentFolder[q].length(); 
     } 
    } 
    return foldersize; 
} 

Sonra dizinleri bir koleksiyonu işlemek için başka bir yöntem yazardı: Yani bu durumda ne yapardı yöntem yazmak olduğunu Örneğin tek bir dizini içine koymak için bir dizi oluşturmak zorunda kalmadan duruma bağlı yöntemler (yani, tek bir dizin veya koleksiyon).

Alternatif olarak, Dosya dizisini alan ve özyinelemeyi yapan tek yöntemi tutabilirsiniz. takip edenler:

public long getFolderSize(File[] directoryList) { 
    long folderSize = 0; 
    for (int i = 0; i < directoryList.length; i++) { 
     File currentFile = directoryList[i]; 
     if (currentFile.isDirectory()) { 
      folderSize += getFolderSize(currentFile.listFiles()); 
     } else { 
      folderSize += currentFile.length(); 
     } 
    } 
    return folderSize; 
} 
+0

'foldersize + = getFolderSize (currentFolder [q]);' – khachik

+0

ve 'folderize + = currentFolder [q] .length();' – khachik

İlgili konular