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