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
f.length(); non mi restituisce il peso giusto, per farvi un esempio il mio codice è questo:codice:File f = new File("abc.txt");
l'output è 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); }
Dato che i conti non tornavano ho fatto una piccola verifica su c: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
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à:
L'output? 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.println(files[i].getPath()+" "+files[i].length()); } } catch (Exception ex) { ex.printStackTrace(); } }
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)...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
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 stranocomunque ora sono su Windows 7 x64, se può servire, grazie in anticipo
![]()

comunque ora sono su Windows 7 x64, se può servire, grazie in anticipo
Rispondi quotando