Buongiorno a tutti, il mio problema è questo:
ho la necessità di, dato un long contenente il peso di un file in byte, stampare in output nome del file e suo peso in modo che sia leggibile, e per farlo ho bisogno di convertire i byte in KB, MB, o GB quando possibile.
Ora, l'ho già fatto in passato e la funzione è piuttosto semplice, il problema è che java, quando faccio

codice:
File f = new File("abc.txt");
f.length(); non mi restituisce il peso giusto, per farvi un esempio il mio codice è questo:

codice:
public static void main(String[] args) {
        try {
            File[] files = new File("C:/").listFiles();
            for (int i = 0; i < files.length; i++) {
                System.out.printf("%50s %50s\n",files[i].getPath(),getFormattedSize(files[i].length()));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    public static String getFormattedSize(long bytes) {
        int unit = 1024;
        if (bytes < unit) {
            return bytes + " B";
        }
        int exp = (int) (Math.log(bytes) / Math.log(unit));
        String preBCharacter = Character.toString("KMGTPE".charAt(exp - 1));
        return String.format("%.1f %sB", bytes / Math.pow(unit, exp), preBCharacter);
    }
l'output è questo:

codice:
C:\Programmi                                              0 B
C:\RaidTool                                                0 B
C:\Recovery                                               0 B
C:\System Volume Information                   20,0 KB
C:\Temp                                                    0 B
C:\ubuntu                                                4,0 KB
C:\Users                                                  4,0 KB
C:\Windows                                            16,0 KB
Dato che i conti non tornavano ho fatto una piccola verifica su c:
C:\Windows pesa 15.9 GB
C:\Programmi pesa 2,41 GB
(non sto a elencarle tutte, credo che il problema sia chiaro)

Ora, vi sarà venuto in mente "C'è qualcosa di sbagliato nell'algoritmo"
Si, è venuto in mente anche a me, l'ho ricontrollato mille volte e mi è sembrato tutto giusto, quindi ho voluto togliermi una curiosità:

codice:
public static void main(String[] args) {
        try {
            File[] files = new File("C:/").listFiles();
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i].getPath()+"         "+files[i].length());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
L'output? Questo:

codice:
C:\Programmi         0
C:\RaidTool         0
C:\Recovery         0
C:\System Volume Information         20480
C:\Temp         0
C:\ubuntu         4096
C:\Users         4096
C:\Windows         16384
Secondo quanto dicono le proprietà di Windows, per la cartella C:\Programmi teoricamente l'output dovrebbe essere un long che vale 2594746368, idem per la cartella C:\Users che occupa 28 GB e passa (30691151974 byte)...

Proprio non capisco, cosa può essere? Mi ricordo che l'ultima volta che mi è servito l'algoritmo di conversione di unità ero su XP e funzionava perfettamente, che sia la versione di windows il problema? Mah, mi fa strano comunque ora sono su Windows 7 x64, se può servire, grazie in anticipo