Activitats

Commutador de carpetes

L’objectiu d’aquesta activitat és veure com crear o esborrar carpetes usant unes rutes relatives.

Feu un programa que actuï de manera diferent segons si existeix o no una carpeta anomenada “Temp” a la seva carpeta de treball. Si no existeix, l’ha d’intentar crear. Si existeix, l’ha de crear. Cada cop que es realitza una acció, cal dir si s’ha pogut dur a terme i la ruta absoluta de la carpeta processada. Per exemple, els missatges següents s’anirien alternant per diferents execucions:

S'ha creat la carpeta C:\IOC Programació\Java\Fonts\Unitat 6\Temp.

i

S'ha esborrat la carpeta C:\IOC Programació\Java\Fonts\Unitat 6\Temp.

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4.  
  5. public class Commutador {
  6.  
  7. public static void main(String[] args) {
  8. Commutador programa = new Commutador();
  9. programa.inici();
  10. }
  11.  
  12. public void inici() {
  13. File f = new File("Temp");
  14. if (f.isDirectory()) {
  15. boolean ok = f.delete();
  16. if (ok) {
  17. System.out.println("S'ha esborrat la carpeta " + f.getAbsolutePath());
  18. } else {
  19. System.out.println("Error esborrant la carpeta " + f.getAbsolutePath());
  20. }
  21. } else {
  22. boolean ok = f.mkdir();
  23. if (ok) {
  24. System.out.println("S'ha creat la carpeta " + f.getAbsolutePath());
  25. } else {
  26. System.out.println("Error creant la carpeta " + f.getAbsolutePath());
  27. }
  28. }
  29.  
  30. }
  31. }

Canviar l'extensió

L’objectiu d’aquesta activitat és veure com canviar el nom a un conjunt de fitxers.

Genereu un programa que pregunti a l’usuari dues cadenes de text de tres lletres, de manera que les pugui escriure pel teclat en una mateixa línia. El programa ha de cercar tots els fitxers en el seu directori de treball que tinguin com extensió la primera cadena de text i canviar-la a la segona. Per exemple, si l’usuari escriu “txt jpg”, tots els fitxers amb extensió ”.txt” han de passar a tenir l’extensió ”.jpg”.

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4. import java.util.Scanner;
  5.  
  6. public class CanviaExtensió {
  7.  
  8.  
  9. public static void main(String[] args) {
  10. CanviaExtensió programa = new CanviaExtensió();
  11. programa.inici();
  12. }
  13.  
  14. public void inici() {
  15. System.out.print("Escriu l'extensió origen i destí: ");
  16. Scanner lector = new Scanner(System.in);
  17. String origen = lector.next();
  18. String desti = lector.next();
  19.  
  20. String dirTreball = System.getProperty("user.dir");
  21. File rutaTreball = new File (dirTreball);
  22.  
  23. File[] elements = rutaTreball.listFiles();
  24.  
  25. for (int i = 0; i < elements.length; i++) {
  26. if (elements[i].isFile()) {
  27. canviaExtensio(elements[i],origen, desti);
  28. }
  29. }
  30. }
  31.  
  32. /** A partir d'una ruta d'un fitxer, mira si té una extensió donada, i si és
  33.   * així, la canvia per una altra.
  34.   *
  35.   * @param ruta Ruta del fitxer a comprovar
  36.   * @param or Ruta origen que cal comprovar
  37.   * @param des Ruta destinació que cal assignar
  38.   */
  39. public void canviaExtensio(File ruta, String or, String des) {
  40. String nom = ruta.getName();
  41. int punt = nom.lastIndexOf(".");
  42. if (punt >= 0) {
  43. String extOrigen = nom.substring(punt + 1, nom.length());
  44. if (extOrigen.equals(or)) {
  45. String nouNom = nom.substring(0, punt + 1) + des;
  46. nouNom = ruta.getParent() + File.separator + nouNom;
  47. File novaRuta = new File(nouNom);
  48. ruta.renameTo(novaRuta);
  49. }
  50. }
  51. }
  52.  
  53. }

Cercar un fitxer

L’objectiu d’aquesta activitat és saber recórrer una jerarquia de carpetes i fitxers per realitzar operacions sobre ella.

Feu un programa que pregunti per pantalla el nom d’un fitxer i el text de la ruta a una carpeta. Aquestes dades les introduirà l’usuari pel teclat. Llavors el programa ha de cercar i mostrar per pantalla la ruta absoluta de tots els fitxers amb aquest nom a partir de la carpeta assenyalada (tant directament dintre seu com dins d’altres carpetes successives).

Tot seguit un exemple de possible funcionament del programa:

Quin és el nom del fitxer a cercar?
Document.txt
Escriu el nom d'una ruta a una carpeta: 
C:\Temp\Documents
----------
S'ha trobat el fitxer a: C:\Temp\Documents\Bibliografia\Document.txt
S'ha trobat el fitxer a: C:\Temp\Documents\Diversos\Documentacio\Document.txt
S'ha trobat el fitxer a: C:\Temp\Documents\Document.txt

Pista: una solució recursiva pot ser més senzilla.

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4. import java.util.Scanner;
  5.  
  6. public class CercaFitxer {
  7.  
  8. public static void main(String[] args) {
  9. CercaFitxer programa = new CercaFitxer();
  10. programa.inici();
  11. }
  12.  
  13. public void inici() {
  14. String nomFitxer = preguntaNomFitxer();
  15. File rutaCarpeta = llegirRutaCarpeta();
  16. System.out.println("----------");
  17. cerca(rutaCarpeta, nomFitxer);
  18. }
  19.  
  20. /** A partir d'una carpeta, cerca si hi ha un fitxer amb aquest nom dins la
  21.   * pròpia carpeta i les seves subcarpetes.
  22.   *
  23.   * @param carpeta Carpeta on fer la cerca
  24.   * @param nom Nom del fitxer a cercar
  25.   */
  26. public void cerca(File carpeta, String nom) {
  27. File[] elements = carpeta.listFiles();
  28. for (int i = 0; i < elements.length; i++) {
  29. if (elements[i].isDirectory()) {
  30. cerca(elements[i], nom);
  31. } else {
  32. String nomElement = elements[i].getName();
  33. if (nomElement.equalsIgnoreCase(nom)) {
  34. System.out.println("S'ha trobat el fitxer a: " + elements[i].getAbsolutePath());
  35. }
  36. }
  37. }
  38.  
  39. }
  40.  
  41. /** Pregunta a l'usuari el nom d'un fitxer (un simple text)
  42.   *
  43.   * @return Text del nom del fitxer
  44.   */
  45. public String preguntaNomFitxer() {
  46. System.out.println("Quin és el nom del fitxer a cercar?");
  47. Scanner lector = new Scanner(System.in);
  48. return lector.nextLine();
  49. }
  50.  
  51. /** Pregunta a l'usuari el nom de la carpeta, i d'aquest obté una ruta.
  52.   *
  53.   * @return La ruta associada al text que ha escrit l'usuari.
  54.   */
  55. public File llegirRutaCarpeta() {
  56. //Un tipus compost es pot deixar sense inicialitzar posant "null"
  57. File f = null;
  58. boolean preguntar = true;
  59. Scanner lector = new Scanner(System.in);
  60. while (preguntar) {
  61. System.out.println("Escriu el nom d'una ruta a una carpeta: ");
  62. String nomCarpeta = lector.nextLine();
  63. f = new File(nomCarpeta);
  64. if (f.isDirectory()) {
  65. preguntar = false;
  66. } else {
  67. System.out.println("Aquesta carpeta no existeix...");
  68. }
  69. }
  70. return f;
  71. }
  72. }

Filtrar fitxers per mida

L’objectiu d’aquesta activitat és aprendre a usar els mètodes de la classe File associats a llistar elements d’una carpeta i accedir a les seves propietats.

Realitzeu un programa que, en executar-se, llegeixi des del teclat la ruta a una carpeta del vostre ordinador. Llavors, ha de mostrat per pantalla tots els fitxers (no les carpetes) amb una mida superior a 500 Kb. (Recordeu que 1 Kb = 1024 bytes.) Si la carpeta no existeix, ha de mostrar un missatge d’error.

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4. import java.util.Scanner;
  5.  
  6. public class LlistarFitxersMida {
  7.  
  8. public static final int KB = 1024;
  9.  
  10. public static void main(String[] args) {
  11. LlistarFitxersMida programa = new LlistarFitxersMida();
  12. programa.inici();
  13. }
  14.  
  15. public void inici() {
  16. File rutaCarpeta = llegirNomCarpeta();
  17. mostraFitxers(rutaCarpeta, 500);
  18. }
  19.  
  20. /** Pregunta a l'usuari el nom de la carpeta, i d'aquest obté una ruta.
  21.   *
  22.   * @return La ruta associada al text que ha escrit l'usuari.
  23.   */
  24. public File llegirNomCarpeta() {
  25. //Un tipus compost es pot deixar sense inicialitzar posant "null"
  26. File f = null;
  27. boolean preguntar = true;
  28. Scanner lector = new Scanner(System.in);
  29. while (preguntar) {
  30. System.out.println("Escriu el nom d'una ruta a una carpeta: ");
  31. String nomCarpeta = lector.nextLine();
  32. f = new File(nomCarpeta);
  33. if (f.isDirectory()) {
  34. preguntar = false;
  35. } else {
  36. System.out.println("Aquesta carpeta no existeix...");
  37. }
  38. }
  39. return f;
  40. }
  41.  
  42. /** Mostra els fitxers dins una carpeta que tenen una mida mínima.
  43.   *
  44.   * @param f La ruta que cal processar.
  45.   * @param mida La mida mínima dels fitxers a llistar (en Kb).
  46.   */
  47. public void mostraFitxers(File f, int mida) {
  48. File[] elements = f.listFiles();
  49. System.out.println("Els fitxers de més de 500 Kb són:");
  50. for (int i = 0; i < elements.length; i++) {
  51. //es pot accedir directament a la ruta usant la posició de l'array.
  52. if (elements[i].isFile()) {
  53. if (elements[i].length() > 500*KB) {
  54. System.out.println(elements[i].getName());
  55. }
  56. }
  57. }
  58. }
  59.  
  60. }

Explorador de carpetes

L’objectiu d’aquesta activitat és combinar tots els vostres coneixements sobre les cadenes de text, la lectura de dades des del teclat i la gestió de fitxers per dur a terme un programa de certa complexitat per gestionar rutes dins el sistema de fitxers.

Es vol crear un explorador del sistema de fitxers en mode text, controlat des del teclat. Aquest programa mostra una línia de comandes on veure’s representada la carpeta actual en què es troba l’usuari. A l’inici, estarà a la carpeta de treball del programa. Llavors, mitjançant les comandes següents es pot explorar el sistema de fitxers:

  • cd .., l’usuari es desplaça a la carpeta pare de l’actual.
  • cd nomCarpeta, l’usuari entra a la carpeta amb el nom “nomCarpeta”, que ha d’estar dins de la carpeta actual.
  • dir, es mostren totes les carpetes i fitxers continguts dins de la carpeta actual.
  • fi, finalitza l’execució del programa.

Cal controlar tots els casos erronis i avisar l’usuari: usar comandes invàlides o intentar entrar en una carpeta inexistent. Un cop s’arriba a la carpeta arrel de l’ordinador, si es fa cd .., no ha de passar res.

A mode il·lustratiu, tot seguit es mostra un exemple d’execució:

C:\IOC Programació\M4M5M6\Fonts\Unitat 6> cd ..
C:\IOC Programació\M4M5M6\Fonts> cd ..
C:\IOC Programació\M4M5M6> cd Fonts
C:\IOC Programació\M4M5M6\Fonts> dir
[DIR] Unitat 4
[DIR] Unitat 5
[DIR] Unitat 6
C:\IOC Programació\M4M5M6\Fonts> cd Hola
Aquesta carpeta no existeix!
C:\IOC Programació\M4M5M6\Fonts> gfsjdhfd
Comanda incorrecta!
C:\IOC Programació\M4M5M6\Fonts> cd Unitat 6
C:\IOC Programació\M4M5M6\Fonts\Unitat 6> dir
[DIR] build
[FILE] build.xml
[FILE] manifest.mf
[DIR] nbproject
[DIR] src
[DIR] test
C:\IOC Programació\M4M5M6\Fonts\Unitat 6> cd ..
C:\IOC Programació\M4M5M6\Fonts> cd ..
C:\IOC Programació\M4M5M6> cd ..
C:\IOC Programació> cd ..
C:\> cd ..
C:\> fi
Fi del programa!

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4. import java.util.Scanner;
  5.  
  6. public class Explorador {
  7.  
  8. public static void main(String[] args) {
  9. Explorador programa = new Explorador();
  10. programa.inici();
  11. }
  12.  
  13. public void inici() {
  14. boolean executar = true;
  15. Scanner lector = new Scanner(System.in);
  16.  
  17. //Obtenir carpeta de treball per saber carpeta "actual"
  18. String dirTreball = System.getProperty("user.dir");
  19. File rutaActual = new File(dirTreball);
  20.  
  21. while(executar) {
  22. System.out.print(rutaActual.getAbsolutePath() + "> ");
  23. String ordre = lector.nextLine();
  24. String[] comandes = ordre.split(" ", 2);
  25. if (comandes.length == 1) {
  26. //Pot ser un "dir" o "fi"
  27. if ("dir".equals(comandes[0])) {
  28. //dir
  29. mostraFitxers(rutaActual);
  30. } else if ("fi".equals(comandes[0])) {
  31. //fi
  32. System.out.println("Fi del programa!");
  33. executar = false;
  34. } else {
  35. System.out.println("Comanda incorrecta!");
  36. }
  37. } else if (comandes.length > 1) {
  38. //Pot ser un "cd"
  39. if ("cd".equals(comandes[0])) {
  40. rutaActual = novaCarpeta(rutaActual, comandes[1]);
  41. } else {
  42. System.out.println("Comanda incorrecta!");
  43. }
  44. }
  45. }
  46. }
  47.  
  48. /** A partir de la carpeta actual i la comanda de l'usuari, es diu quina és la
  49.   * nova carpeta.
  50.   *
  51.   * @param actual carpeta actual
  52.   * @param ordre text escrit per l'usuari
  53.   * @return nova carpeta actual
  54.   */
  55. public File novaCarpeta(File actual, String ordre) {
  56. if ("..".equals(ordre)) {
  57. //S'ha escrit "..", cal pujar al pare
  58. String pare = actual.getParent();
  59. if (pare != null) {
  60. File novaRuta = new File (pare);
  61. return novaRuta;
  62. }
  63. } else {
  64. //S'ha escrit un nom, cal veure si està bé
  65. String novaCarpeta = actual.getAbsolutePath() + File.separator + ordre;
  66. File novaRuta = new File(novaCarpeta);
  67. if (novaRuta.exists()) {
  68. return novaRuta;
  69. } else {
  70. System.out.println("Aquesta carpeta no existeix!");
  71. }
  72. }
  73. return actual;
  74. }
  75.  
  76. /** A partir d'una ruta, mostra per pantalla el seu contingut.
  77.   *
  78.   * @param ruta ruta de la carpeta a mostrar
  79.   */
  80. public void mostraFitxers(File ruta) {
  81. File[] elements = ruta.listFiles();
  82. for (int i = 0; i < elements.length; i++) {
  83. if(elements[i].isFile()) {
  84. System.out.println("[FILE] " + elements[i].getName());
  85. } else {
  86. System.out.println("[DIR] " + elements[i].getName());
  87. }
  88. }
  89. }
  90.  
  91. }

Explorador de carpetes avançat

L’objectiu d’aquesta activitat és ampliar un programa existent que gestiona fitxers, de manera que s’hi integrin noves funcionalitats.

Modifiqueu el programa de l’explorador de carpetes de manera que incorpori les comandes següents:

  • del nomFitxer, esborra el fitxer de la carpeta actual anomenat “nomFitxer”.
  • prop nomFitxer, mostra les propietats d’un fitxer: la seva mida i la seva darrera data de modificació.

Tot seguit es mostra un exemple de com podria funcionar el programa:

C:\IOC Programació\M4M5M6\Fonts\Unitat 6> cd ..
C:\IOC Programació\M4M5M6\Fonts> dir
[FILE] Document.txt
[DIR] Unitat 4
[DIR] Unitat 5
[DIR] Unitat 6
C:\IOC Programació\M4M5M6\Fonts> prop Document.txt
----------
Mida: 68
Modificació: Thu Jun 02 15:31:38 CEST 2011
----------
C:\IOC Programació\M4M5M6\Fonts> del Document.txt
S'ha esborrat el fitxer.
C:\IOC Programació\M4M5M6\Fonts> dir
[DIR] Unitat 4
[DIR] Unitat 5
[DIR] Unitat 6
C:\IOC Programació\M4M5M6\Fonts> 

  1. package unitat6.apartat1.activitats;
  2.  
  3. import java.io.File;
  4. import java.util.Date;
  5. import java.util.Scanner;
  6.  
  7. public class ExploradorEspecial {
  8.  
  9. public static void main(String[] args) {
  10. ExploradorEspecial programa = new ExploradorEspecial();
  11. programa.inici();
  12. }
  13.  
  14. public void inici() {
  15. boolean executar = true;
  16. Scanner lector = new Scanner(System.in);
  17.  
  18. //Obtenir carpeta de treball per saber carpeta "actual"
  19. String dirTreball = System.getProperty("user.dir");
  20. File rutaActual = new File(dirTreball);
  21.  
  22. while(executar) {
  23. System.out.print(rutaActual.getAbsolutePath() + "> ");
  24. String ordre = lector.nextLine();
  25. String[] comandes = ordre.split(" ", 2);
  26. if (comandes.length == 1) {
  27. //Pot ser un "dir" o "fi"
  28. if ("dir".equals(comandes[0])) {
  29. //dir
  30. mostraFitxers(rutaActual);
  31. } else if ("fi".equals(comandes[0])) {
  32. //fi
  33. System.out.println("Fi del programa!");
  34. executar = false;
  35. } else {
  36. System.out.println("Comanda incorrecta!");
  37. }
  38. } else if (comandes.length > 1) {
  39. //Pot ser un "cd" o "del" o "rename"
  40. if ("cd".equals(comandes[0])) {
  41. rutaActual = novaCarpeta(rutaActual, comandes[1]);
  42. }else if ("del".equals(comandes[0])) {
  43. esborraFitxer(rutaActual, comandes[1]);
  44. }else if ("prop".equals(comandes[0])) {
  45. mostraPropietats(rutaActual, comandes[1]);
  46. } else {
  47. System.out.println("Comanda incorrecta!");
  48. }
  49. }
  50. }
  51. }
  52.  
  53. /** A partir de la carpeta actual i la comanda de l'usuari, es diu quina és la
  54.   * nova carpeta.
  55.   *
  56.   * @param actual carpeta actual
  57.   * @param carpeta nom de la nova carpeta on moure's
  58.   * @return nova carpeta actual
  59.   */
  60. public File novaCarpeta(File actual, String carpeta) {
  61. //El codi és el mateix que abans
  62. ...
  63. }
  64.  
  65. /** A partir d'una ruta, mostra per pantalla el seu contingut.
  66.   *
  67.   * @param ruta ruta de la carpeta a mostrar
  68.   */
  69. public void mostraFitxers(File ruta) {
  70. //El codi és el mateix que abans
  71. ...
  72. }
  73.  
  74. /** A partir de la carpeta actual i el nom d'un fitxer, l'esborra.
  75.   *
  76.   * @param actual carpeta actual
  77.   * @param fitxer nom del fitxer a esborrar
  78.   */
  79. public void esborraFitxer(File actual, String fitxer) {
  80. String nom = actual.getAbsolutePath() + File.separator + fitxer;
  81. File rutaFitxer = new File(nom);
  82. if (rutaFitxer.isFile()) {
  83. rutaFitxer.delete();
  84. System.out.println("S'ha esborrat el fitxer.");
  85. } else {
  86. System.out.println("No existeix aquest fitxer!");
  87. }
  88. }
  89.  
  90. /** A partir de la carpeta actual i el nom d'un fitxer, mostra les propietats.
  91.   *
  92.   * @param actual carpeta actual
  93.   * @param fitxer nom del fitxer a esborrar
  94.   */
  95.  
  96. public void mostraPropietats(File actual, String fitxer) {
  97. String nom = actual.getAbsolutePath() + File.separator + fitxer;
  98. File rutaFitxer = new File(nom);
  99. if (rutaFitxer.isFile()) {
  100. System.out.println("----------");
  101. System.out.println("Mida: " + rutaFitxer.length());
  102. long mod = rutaFitxer.lastModified();
  103. Date data = new Date(mod);
  104. System.out.println("Modificació: " + data);
  105. System.out.println("----------");
  106. } else {
  107. System.out.println("No existeix aquest fitxer!");
  108. }
  109. }
  110.  
  111. }

Anar a la pàgina anterior:
Gestió de fitxers
Anar a la pàgina següent:
Exercicis d'autoavaluació