Aiuto con script programma copia e incolla

di il
11 risposte

Aiuto con script programma copia e incolla

Buongiorno a tutti,

sto cercando di creare un programma che per una cartella che do in input, analizzi tutti i suoi file, cerchi quelli che contengono un nome che dico io e copino il file in un altra cartella. Nello specifico, io vorrei cercare nel nome del file il "codice" e l'anno. I file che ho infatti sono fatti così: 123123.2022 , dove 123123 è il codice e 2022 l'anno.
Essendo totalmente inesperto ho cercato in lungo e in largo e messo assieme questo codice, che però non funziona, in quanto non copia nessun file. Spero qualcuno di voi possa mettere ordine nel codice e anche nella mia testa

Codice:
public class Layout extends JFrame {

/**
*
*/

private static final long serialVersionUID = 1L;

//Crea etichette
JLabel percorsoLabel = new JLabel("Percorso directory", SwingConstants.CENTER);
JLabel spazio1= new JLabel(" ", SwingConstants.CENTER);
JLabel dittaLabel = new JLabel("Ditta", SwingConstants.CENTER);
JLabel spazio2= new JLabel(" ", SwingConstants.CENTER);
JLabel annoLabel = new JLabel("Anni", SwingConstants.CENTER);
JLabel spazio3= new JLabel(" ", SwingConstants.CENTER);
JLabel percorsoDestLabel = new JLabel(" Percorso di Destinazione", SwingConstants.CENTER);
//Numero caratteri degli spazi
JTextField percorsoText = new JTextField(30);
JTextField dittaText = new JTextField(20);
JTextField annoText = new JTextField(20);
JTextField percorsoDestText = new JTextField(30);

//Pulsante
JButton pulsante = new JButton("Copia");
JButton pulsante1 = new JButton("Sfoglia");
JButton pulsante2 = new JButton("Sfoglia");

//costruttore dell'applicazione
public Layout() throws IOException {
super("Strumento di copia contabilità");
//Dimensioni pannello
setSize(600, 250);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel pannello = new JPanel();

dittaText.setEditable(true);
annoText.setEditable(true);

// Layout FlowLayout
pannello.add(percorsoLabel);
pannello.add(pulsante1);
pannello.add(percorsoText);
pannello.add(spazio1);
pannello.add(dittaLabel);
pannello.add(dittaText);
pannello.add(spazio2);
pannello.add(annoLabel);
pannello.add(annoText);
pannello.add(spazio3);
pannello.add(percorsoDestLabel);
pannello.add(pulsante2);
pannello.add(percorsoDestText);
pannello.add(pulsante);

setContentPane(pannello);
setResizable(false);
setVisible(true);
JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
// Azione su pulsante di sorgente
ActionListener copia = new ActionListener(){
public void actionPerformed(ActionEvent e){
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnValue = jfc.showOpenDialog(null);
// int returnValue = jfc.showSaveDialog(null);

if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
String f = selectedFile.getAbsoluteFile().toString();
percorsoText.setText(f);

}
}
};
// Azione pulsante di destinazione
ActionListener incolla = new ActionListener(){
public void actionPerformed(ActionEvent e){
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnValue = jfc.showOpenDialog(null);
// int returnValue = jfc.showSaveDialog(null);

if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
String f = selectedFile.getAbsoluteFile().toString();
percorsoDestText.setText(f);

}
}
};

pulsante1.addActionListener(copia);
pulsante2.addActionListener(incolla);
}


// Costruttore copia

private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
System.out.println("The File is copied to newFile.");
is.close();
os.close();
}
}
//imposta filtri con ciclo copia
JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
File[] cartella = new File[(int) jfc.getCurrentDirectory().getAbsoluteFile().length()];
public void filtra(File e, String from, String filter, String filter1) throws IOException{

FileFilter accetta = new FileFilter() {
public boolean accept(File f) {
return f.isDirectory()
|| (f.isFile() && f.getName().toLowerCase().contentEquals(filter) &&
f.getName().toLowerCase().contentEquals(filter1));
}
};
for (int j = 0; j < cartella.length; j++) {
cartella = jfc.getCurrentDirectory().getAbsoluteFile().listFiles(accetta);

}

ActionListener copia = new ActionListener(){
public void actionPerformed(ActionEvent e){

for (int j = 0; j < cartella.length; j++) {

try {
copyFileUsingStream(cartella[j], new File(percorsoDestText.getText()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
};
pulsante.addActionListener(copia);
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub

Layout program = new Layout();

}

11 Risposte

  • Re: Aiuto con script programma copia e incolla

    pedrotn ha scritto:


    sto cercando di creare un programma che per una cartella che do in input, analizzi tutti i suoi file, cerchi quelli che contengono un nome che dico io e copino il file in un altra cartella. Nello specifico, io vorrei cercare nel nome del file il "codice" e l'anno. I file che ho infatti sono fatti così: 123123.2022 , dove 123123 è il codice e 2022 l'anno.
    Premesso che il codice che hai scritto è parecchio "pasticciato" (nonché con cose inutili/errate) e tralasciando solo per un momento la parte grafica (forse meno importante ora), la questione esattamente quale è?

    Data una directory (nota o comunque scelta dall'utente) vuoi ottenere solo i file che hanno un nome che corrisponde alla forma generale (cioè ideale) cccccc.aaaa ? Questo si può fare con l'aiuto delle regular expression definendo un pattern con quella forma.
  • Re: Aiuto con script programma copia e incolla

    Grazie mille per la risposta,
    Capisco che sia pasticciato, anche perché sono veramente un neofita, non ho mai fatto linguaggio java e pertanto......

    Esatto a me serve copiare i file che hanno un tal nome in un'altra cartella che dico io.
    Come funzionerebbe tale funzione?
  • Re: Aiuto con script programma copia e incolla

    pedrotn ha scritto:


    Esatto a me serve copiare i file che hanno un tal nome in un'altra cartella che dico io.
    Sì ma un conto è se il nome lo "sai" (es. perché magari l'ha selezionato l'utente con un chooser) e un altro conto è se il nome NON lo sai ma sai solo la forma "generale" (es. cccccc.aaaa).

    Se è il secondo caso, si può fare con le regular expression, ecco un esempio (abbozzato, directory da assegnare):
    Pattern patternFile = Pattern.compile("\\d{6}\\.\\d{4}");
    
    File directory = //..........
    
    File[] fileTrovati = directory.listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.isFile() && patternFile.matcher(file.getName()).matches();
        }
    });
    Il Pattern descrive: "6 cifre seguite da punto, seguito da 4 cifre" (es. 123456.2022, 445566.2021 ecc....).
    E il filtro "accetta" il file se è un regular file E se il nome corrisponde a quella forma "generale".
  • Re: Aiuto con script programma copia e incolla

    Io il nome non lo so e deve cercare lui. Nel senso che se io scrivo nell'etichetta "123" Lui deve andare a cercare il file che contiene nel nome "123" E copiarlo.

    Scusa se non so spiegarmi meglio
  • Re: Aiuto con script programma copia e incolla

    pedrotn ha scritto:


    Io il nome non lo so e deve cercare lui. Nel senso che se io scrivo nell'etichetta "123" Lui deve andare a cercare il file che contiene nel nome "123" E copiarlo.
    Si tratta allora di un "contains" (attenzione, NON contentEquals)
    File directory = //.......
    String ricerca = //..... es. "123"
    
    File[] fileTrovati = directory.listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.isFile() && file.getName().toLowerCase().contains(ricerca);
        }
    });
    Attenzione anche a NON confondere il filter che si usa con i list/listFiles di java.io.File e il filter che si usa con JFileChooser. Sono entrambi "filtri" (come concetto) ma con scopi diversi e non interscambili.
  • Re: Aiuto con script programma copia e incolla

    Grazie ora forse parte del problema lo ho risolto. Ora mi chiedo. Come faccio a copiare i file?
  • Re: Aiuto con script programma copia e incolla

    pedrotn ha scritto:


    Come faccio a copiare i file?
    Quello che hai scritto nel copyFileUsingStream(File source, File dest) funzionalmente è corretto (cioè copia correttamente tutti i byte) ma è comunque sbagliato nella gestione dei close(), che non va fatta così.

    Si può comunque abbreviare e rendere corretto in vari modi, usando il try-with-resource (Java 7+) e usando il transferTo(OutputStream) di InputStream (Java 9+).
  • Re: Aiuto con script programma copia e incolla

    Modificando un pò il codice che avevo prima, come mi hai consigliato tu mi è venuto fuori questo, ma comunque non funziona. Non capisco dove sia il problema, forse non riesce a trovare i file nella cartella. percorsoText è il percorso della cartella origine e percorsoDestText è il percorso della cartella di destinazione dove copiare i file.


    //imposta filtri con ciclo copia

    Path origine = Paths.get(percorsoText.getText());
    File directory = origine.toFile();
    String ricerca = dittaText.getText();

    File[] fileTrovati = directory.listFiles(new FileFilter() {
    public boolean accept(File file) {
    return file.isFile() && file.getName().toLowerCase().contains(ricerca);
    }
    });


    Path destinazione = Paths.get(percorsoDestText.getText());

    ActionListener tastoCopia = new ActionListener(){
    public void actionPerformed(ActionEvent e){

    for (int j = 0; j < fileTrovati.length; j++) {

    try {
    Files.copy(fileTrovati[j].toPath(), destinazione );

    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    };
    pulsante.addActionListener(tastoCopia);

    }
    };
  • Re: Aiuto con script programma copia e incolla

    pedrotn ha scritto:


     //imposta filtri con ciclo copia
    
    	Path origine = Paths.get(percorsoText.getText());
    	File directory = origine.toFile();
    	String ricerca = dittaText.getText();
    
    	File[] fileTrovati = directory.listFiles(new FileFilter() {
    	    public boolean accept(File file) {
    	        return file.isFile() && file.getName().toLowerCase().contains(ricerca);
    	    }
    	});
    
    
    	Path destinazione = Paths.get(percorsoDestText.getText());
    Ma questa parte QUANDO viene eseguita? Deve essere eseguita solo DOPO che l'utente ha inserito i dati nei campi e fatto la azione che avvia la copia. Non prima.
  • Re: Aiuto con script programma copia e incolla

    È tutto inserito come azione del pulsante di copia. Dovrebbe essere dopo no?
  • Re: Aiuto con script programma copia e incolla

    Mi restituisce il seguente errore:
    Cannot load from object array because "this.this$0.fileTrovati" is null
    at test.Layout$2.actionPerformed(Layout.java:142)

    Come mai l'array filetrovati è nullo??
Devi accedere o registrarti per scrivere nel forum
11 risposte