M3 - Programació estructurada / Activitats UF3: Clase File

De wikiserver
Dreceres ràpides: navegació, cerca

Nota: No tots els mètodes de la classe File estan descrits en els apunts. Necessitaràs fer servir algun més. Consulta la informació d’aquests a: documents oracle - File


1. Feu un programa que actuï de manera diferent segons si existeix o no una carpeta anomenada “Temp” a la carpeta de treball. Si no existeix, l'ha d'intentar crear. Si existeix, l'ha d’esborrar. 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 saber el directori de treball es pot fer servir: System.getProperty("user.dir")
  • Més informació de les propietats del sistema a: documents oracle - getProperties


package exercicisfitxers;

import java.io.File;
import java.io.FileNotFoundException;

public class Commutador {

    public static void main(String[] args) throws FileNotFoundException{
        Commutador programa = new Commutador();
        programa.inici();
    }

    public void inici() {
        File f = new File("Temp");
        if (f.isDirectory()) {
            boolean ok = f.delete();
            if (ok) {
                
                 System.out.println("S'ha esborrat la carpeta " + f.getAbsolutePath());
            } else {
               System.out.println("Error esborrant la carpeta " + f.getAbsolutePath());
            }
        } else {
            boolean ok = f.mkdir();
            if (ok) {
                 System.out.println("S'ha creat la carpeta " + f.getAbsolutePath());
               
            } else {
                 System.out.println("Error creant la carpeta " + f.getAbsolutePath());
                
            }
        }

    }
}

2. Genereu un programa que demani 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 a 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”.


package exercicisfitxers;

import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class CanviaExtensió {

    public static void main(String[] args) throws FileNotFoundException{
        CanviaExtensi programa = new CanviaExtensió();
        programa.inici();
    }

    public void inici() {
        System.out.print("Escriu l'extensió origen i destí: ");
        Scanner lector = new Scanner(System.in);
        String origen = lector.next();
        String desti = lector.next();

        String dirTreball = System.getProperty("user.dir");
        File rutaTreball = new File(dirTreball);

        File[] elements = rutaTreball.listFiles();

        for (int i = 0; i < elements.length; i++) {
            if (elements[i].isFile()) {
                canviaExtensio(elements[i], origen, desti);
            }
        }
    }

    /**
     * A partir d'una ruta d'un fitxer, mira si té una extensió donada, i si és
     * així, la canvia per una altra.
     *
     * @param ruta Ruta del fitxer a comprovar
     * @param or Ruta origen que cal comprovar
     * @param des Ruta destinació que cal assignar
     */
    public void canviaExtensio(File ruta, String or, String des) {
        String nom = ruta.getName();
        int punt = nom.lastIndexOf(".");
        if (punt >= 0) {
            String extOrigen = nom.substring(punt + 1, nom.length());
            if (extOrigen.equals(or)) {
                String nouNom = nom.substring(0, punt + 1) + des;
                nouNom = ruta.getParent() + File.separator + nouNom;
                File novaRuta = new File(nouNom);
                ruta.renameTo(novaRuta);
            }
        }
    }
}

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


package exercicisfitxers;

import java.io.File;
import java.util.Scanner;

public class LlistarFitxersMida {

    public static final int KB = 1024;

    public static void main(String[] args) {
        LlistarFitxersMida programa = new LlistarFitxersMida();
        programa.inici();
    }

    public void inici() {
        File rutaCarpeta = llegirNomCarpeta();
        mostraFitxers(rutaCarpeta, 500);
    }

    /**
     * Pregunta a l'usuari el nom de la carpeta, i d'aquest obté una ruta.
     *
     * @return La ruta associada al text que ha escrit l'usuari.
     */
    public File llegirNomCarpeta() {
        File f = null;
        boolean preguntar = true;
        Scanner lector = new Scanner(System.in);
        while (preguntar) {
            System.out.println("Escriu el nom d'una ruta a una carpeta: ");
            String nomCarpeta = lector.nextLine();
            f = new File(nomCarpeta);
            if (f.isDirectory()) {
                preguntar = false;
            } else {
                System.out.println("Aquesta carpeta no existeix...");
            }
        }
        return f;
    }

    /**
     * Mostra els fitxers dins una carpeta que tenen una mida mínima.
     *
     * @param f La ruta que cal processar.
     * @param mida La mida mínima dels fitxers a llistar (en Kb).
     */
    public void mostraFitxers(File f, int mida) {
        File[] elements = f.listFiles();
        System.out.println("Els fitxers de més de 500 Kb són:");
        for (int i = 0; i < elements.length; i++) {
           
            if (elements[i].isFile()) { 
               
                if (elements[i].length() > 500 * KB) {
                    System.out.println(elements[i].getName());
                }
            }
        }
    }
}

4. Feu un programa que pregunti per pantalla el nom (o part del nom) d'un fitxer i 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).


**************
package exercicisfitxers;

import java.io.File;
import java.util.Scanner;

public class CercaFitxer {

    public static void main(String[] args) {
        CercaFitxer programa = new CercaFitxer();
        programa.inici();
    }

    public void inici() {
        String nomFitxer = preguntaNomFitxer();
        File rutaCarpeta = llegirRutaCarpeta();
        System.out.println("----------");
        cerca(rutaCarpeta, nomFitxer);
    }

    /**
     * A partir d'una carpeta, cerca si hi ha un fitxer amb aquest nom dins la
     * pròpia carpeta i les seves subcarpetes.
     *
     * @param carpeta Carpeta on fer la cerca
     * @param nom Nom del fitxer a cercar
     */
    public void cerca(File carpeta, String nom) {
        File[] elements = carpeta.listFiles();
        for (int i = 0; i < elements.length; i++) {
            if (elements[i].isDirectory()) {
                cerca(elements[i], nom);
            } else {
                String nomElement = elements[i].getName();
                if (nomElement.contains(nom)) {
                    System.out.println("S'ha trobat el fitxer a: " + elements[i].getAbsolutePath());
                }
            }
        }

    }

    /**
     * Pregunta a l'usuari el nom d'un fitxer (un simple text)
     *
     * @return Text del nom del fitxer
     */
    public String preguntaNomFitxer() {
        System.out.println("Quin és el nom del fitxer a cercar?");
        Scanner lector = new Scanner(System.in);
        return lector.nextLine();
    }

    /**
     * Pregunta a l'usuari el nom de la carpeta, i d'aquest obté una ruta.
     *
     * @return La ruta associada al text que ha escrit l'usuari.
     */
    public File llegirRutaCarpeta() {
        File f = null;
        boolean preguntar = true;
        Scanner lector = new Scanner(System.in);
        while (preguntar) {
            System.out.println("Escriu el nom d'una ruta a una carpeta: ");
            String nomCarpeta = lector.nextLine();
            f = new File(nomCarpeta);
            if (f.isDirectory()) {
                preguntar = false;
            } else {
                System.out.println("Aquesta carpeta no existeix...");
            }
        }
        return f;
    }

5. 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.
  • ls, es mostren totes les carpetes i fitxers continguts dins de la carpeta actual.
  • 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ó.
  • 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.


package exercicisfitxers;

import java.io.File;
import java.util.Date;
import java.util.Scanner;
import java.util.StringTokenizer;

public class ExploradorEspecial {

    public static void main(String[] args) {
        ExploradorEspecial programa = new ExploradorEspecial();
        programa.inici();
    }

    public void inici() {
        boolean executar = true;
        Scanner lector = new Scanner(System.in);

//Obtenir carpeta de treball per saber carpeta "actual"
        String dirTreball = System.getProperty("user.dir");
        File rutaActual = new File(dirTreball);

        while (executar) {
            System.out.print(rutaActual.getAbsolutePath() + "> ");
            String ordre = lector.nextLine();
            StringTokenizer st= new StringTokenizer(ordre);
          //  String[] comandes = ordre.split(" ", 2);
          
            String comandes[]=new String [st.countTokens()];
              int i=0;
            while (st.hasMoreTokens()){
                comandes[i++]=st.nextToken();
            }
            if (comandes.length == 1) {
//Pot ser un "ls" o "fi"
                if ("ls".equals(comandes[0])) {

                    mostraFitxers(rutaActual);
                } else if ("fi".equals(comandes[0])) {

                    System.out.println("Fi del programa!");
                    executar = false;
                } else {
                    System.err.println("Comanda incorrecta!");
                }
            } else if (comandes.length > 1) {

                if ("cd".equals(comandes[0])) {
                    rutaActual = novaCarpeta(rutaActual, comandes[1]);
                } else if ("del".equals(comandes[0])) {
                    esborraFitxer(rutaActual, comandes[1]);
                } else if ("prop".equals(comandes[0])) {
                    mostraPropietats(rutaActual, comandes[1]);
                } else {
                    System.out.println("Comanda incorrecta!");
                }
            }
        }
    }

    /**
     * A partir de la carpeta actual i la comanda de l'usuari, es diu quina és
     * la nova carpeta.
     *
     * @param actual carpeta actual
     * @param carpeta nom de la nova carpeta on moure's
     * @return nova carpeta actual
     */
    public File novaCarpeta(File actual, String ordre) {
        if ("..".equals(ordre)) {
//S'ha escrit "..", cal pujar al pare
            String pare = actual.getParent();
            if (pare != null) {
                File novaRuta = new File(pare);
                return novaRuta;
            }
        } else {
//S'ha escrit un nom, cal veure si està bé
            String novaCarpeta = actual.getAbsolutePath() + File.separator + ordre;
            File novaRuta = new File(novaCarpeta);
            if (novaRuta.exists()) {
                return novaRuta;
            } else {
                System.out.println("Aquesta carpeta no existeix!");
            }
        }
        return actual;
    }

    /**
     * A partir d'una ruta, mostra per pantalla el seu contingut.
     *
     * @param ruta ruta de la carpeta a mostrar
     */
    public void mostraFitxers(File ruta) {
        File[] elements = ruta.listFiles();
        for (int i = 0; i < elements.length; i++) {
            if (elements[i].isFile()) {
                System.out.println("[FILE] " + elements[i].getName());
            } else {
                System.out.println("[DIR] " + elements[i].getName());
            }
        }
    }

    /**
     * A partir de la carpeta actual i el nom d'un fitxer, l'esborra.
     *
     * @param actual carpeta actual
     * @param fitxer nom del fitxer a esborrar
     */
    public void esborraFitxer(File actual, String fitxer) {
        String nom = actual.getAbsolutePath() + File.separator + fitxer;
        File rutaFitxer = new File(nom);
        if (rutaFitxer.isFile()) {
            rutaFitxer.delete();
            System.out.println("S'ha esborrat el fitxer.");
        } else {
            System.out.println("No existeix aquest fitxer!");
        }
    }

    /**
     * A partir de la carpeta actual i el nom d'un fitxer, mostra les
     * propietats.
     *
     * @param actual carpeta actual
     * @param fitxer nom del fitxer a esborrar
     */
    public void mostraPropietats(File actual, String fitxer) {
        String nom = actual.getAbsolutePath() + File.separator + fitxer;
        File rutaFitxer = new File(nom);
        if (rutaFitxer.isFile()) {
            System.out.println("----------");
            System.out.println("Mida: " + rutaFitxer.length());
            long mod = rutaFitxer.lastModified();
            Date data = new Date(mod);
            System.out.println("Modificació: " + data);
            System.out.println("----------");
        } else {
            System.out.println("No existeix aquest fitxer!");
        }
    }
}

Ampliació exercicis File

6. Fes un programa que accepti com a paràmetre de programa una determinada extensió de fitxer (per exemple "xml"). Una vegada fet això el programa crearà la carpeta "ElTeuHome/m3/fitxers/extensio (l'extensió que toqui) i copiarà (no mourà) tots els fitxers que trobi amb aquella extensió dins de tot el "home" inclosos tots els subdirectoris.

  • Investiga el mètode copy de la classe Files i el mètode toPath de la classe File.


para estudiar funcionamiento:

opc1
private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {    
        Files.copy(source.toPath(), dest.toPath());
}


opc2

public void cp(String source, String destination, boolean recursive)
      throws NoSuchFileException, IOException {
    File srcFile = getPath(source).toFile();
    File destFile = getPath(destination).toFile();

    if (!srcFile.exists()) {
      throw new FileNotFoundException(source);
    }

    if (srcFile.isDirectory() && !recursive) {
      String exMsg = "'%s' is Directory";
      throw new IOException(String.format(exMsg, source));
    }

    if (srcFile.equals(destFile)) {
      String exMsg = "'%s' and '%s' are the same";
      throw new IOException(String.format(exMsg, source, destination));
    }

    if (srcFile.isFile()) {
      if (destFile.isDirectory()) {
        destFile = new File(destFile, source);
      }
      Files.copy(srcFile.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    } else {
      Files.walkFileTree(srcFile.toPath(), new FileVisitorImpl(srcFile, destFile));
    }
  }
ALUMNE

package exercicisfitxers;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Scanner;

public class CopyFitxers {

    public static void main(String[] args) throws IOException {
        CopyFitxers met = new CopyFitxers();
        String RutaRecu = "/home/alumne.daw1r@ies.merce/Escriptori";//Ubuntu
        String s1 = "Introduce una extension:";
        String ext = met.SCAN(s1);
        String RutaCarpeta = "/media/alumne.daw1r/TOSHIBA EXT/M3/UF3/CASE_FILE/EX6" + File.separator + ext+File.separator;//Ubuntu
        met.CrearCarpeta(RutaCarpeta, ext);
        met.Busqueda(RutaRecu, ext, RutaCarpeta);
        met.MuestraCarpeta(RutaCarpeta, ext);
    }

    public String SCAN(String s) {
        System.out.println(s);
        Scanner lector = new Scanner(System.in);
        String txt = lector.nextLine();
        return txt;
    }

    public void CrearCarpeta(String RutaCarpeta, String ext) {
        File dir = new File(RutaCarpeta);
        if (!dir.exists()) {
            boolean creado = dir.mkdir();
            if (creado) {
                System.out.println("Se ha creado la carpeta " + ext);
            }
        } else {
            System.out.println("La carpeta ya existe.");
        }
    }

    public void Busqueda(String RutaRecu, String ext, String RutaCarpeta) throws IOException {
        File fit = new File(RutaRecu);
        File[] docum = fit.listFiles();
        String newRuta = "";
        for (int i = 0; i < docum.length; i++) {
            if (docum[i].isFile()) {
                int punto = docum[i].getName().lastIndexOf(".");
                String comp = docum[i].getName().substring(punto + 1, docum[i].getName().length());
                if (comp.equals(ext)) {
                    File destino = new File(RutaCarpeta + docum[i].getName());
                    Files.copy(docum[i].toPath(), destino.toPath());
                }
            } else {
                newRuta = docum[i].getPath();
                Busqueda(newRuta, ext, RutaCarpeta);
            }
        }
    }

    public void MuestraCarpeta(String RutaCarpeta, String ext) {
        File dir = new File(RutaCarpeta);
        File[] docum = dir.listFiles();
        System.out.println("La capeta " + ext + " contiene:");
        for (int i = 0; i < docum.length; i++) {
            System.out.println(docum[i]);
        }
    }
}