» »

Java skeniranje map in podmap

Java skeniranje map in podmap

GeForce ::

Pozdravljeni, poskušam naredit nek program (še začetnik), in se mi zatakne pri skeniranju datotek v mapah in podmapah. Trenutno imam tole kodo:
String filename;  
    ArrayList<String> seznamMP3 = new ArrayList<>();  
    ArrayList<String> seznamMP3Pot = new ArrayList<>();  
      
    ArrayList<String> seznamDatotek = new ArrayList<>();  
    ArrayList<String> seznamPodmap = new ArrayList<>();  
    String[] simpleSeznamPodmap = new String[seznamPodmap.size()];  
      
    public void Iskanje(String mapa){  
        File folder = new File(mapa);  
        File[] listOfFiles = folder.listFiles();  
          
        for (int i = 0; i < listOfFiles.length; i++) {  
         if (listOfFiles[i].isFile()) {  
             seznamDatotek.add(listOfFiles[i].getPath());  
               
             if (listOfFiles[i].getName().endsWith(".mp3")){  
                 seznamMP3.add(listOfFiles[i].getName());  
                 seznamMP3Pot.add(listOfFiles[i].getPath());  
                 }  
               
          } else if (listOfFiles[i].isDirectory()) {  
            seznamPodmap.add(listOfFiles[i].getPath());  
          }  
        }  
          
          
        seznamPodmap.toArray(simpleSeznamPodmap);  
          
          
        System.out.println(seznamDatotek);  
        System.out.println(seznamPodmap);  
        System.out.println(seznamMP3);  
        System.out.println(seznamMP3);  
    } 


in tole
for (int k=0; k<simpleSeznamPodmap.length; k++){  
                Iskanje(simpleSeznamPodmap[k]);  
            }  


Zadeva sicer nekako deluje, ampak mi izpiše le datoteke iz prve mape, ne pa tudi iz podmap.

Tako da bi rabil kakšen nasvet kje sem kaj zgrešil da ne pregleda tudi podmap?

Hvala

genesiss ::

Katera verzija jave?

Čudno izgleda tvoja koda (predvsem tole: seznamPodmap.toArray(simpleSeznamPodmap); ). Lahko prosim prilepiš celoten program v enem kosu. Zakaj se ne lotiš težave rekurzivno?

Zgodovina sprememb…

  • spremenil: genesiss ()

GeForce ::

Java mislim da je najnovejša...ups koda pa je trenutno nekoliko drugačna, izgleda da sem kopiral nekoliko prejšnjo verzijo....trenutno celotna koda:
import java.awt.List;
import java.io.File;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;

public class GlavnoOkno extends javax.swing.JFrame {
    
    
    String filename;
    String SkupnaVelikost;
    ArrayList<Integer> seznamIndexov = new ArrayList<>();
    String koncnaMapaPot;
    ArrayList<String> seznamMP3 = new ArrayList<>();
    ArrayList<File> seznamMP3File = new ArrayList<>();
    ArrayList<String> seznamMP3Pot = new ArrayList<>();
    
    ArrayList<String> seznamDatotek = new ArrayList<>();
    ArrayList<String> seznamPodmap = new ArrayList<>();
    String[] simpleSeznamPodmap = new String[seznamPodmap.size()];
    
    public void Iskanje(String mapa){
        File folder = new File(mapa);
        File[] listOfFiles = folder.listFiles();
        
        for (File listOfFile : listOfFiles) {
            if (listOfFile.isFile()) {
                seznamDatotek.add(listOfFile.getPath());
                if (listOfFile.getName().endsWith(".mp3")) {
                    seznamMP3.add(listOfFile.getName());
                    seznamMP3Pot.add(listOfFile.getPath());
                    seznamMP3File.add(listOfFile);
                }
            } else if (listOfFile.isDirectory()) {
                seznamPodmap.add(listOfFile.getPath());
            }
        }
        
        
        seznamPodmap.toArray(simpleSeznamPodmap);
        
        
        System.out.println(seznamDatotek);
        System.out.println(seznamPodmap);
        System.out.println(seznamMP3);
        System.out.println(seznamMP3);
    }
    
    

    public GlavnoOkno() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        btnZacetna = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        btnCiljna = new javax.swing.JButton();
        scrlPaneDatoteke = new javax.swing.JScrollPane();
        btnRandomize = new javax.swing.JButton();
        btnKopiraj = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        txtVelikost = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("RandomCopier v0.1");

        jLabel1.setText("Začetna mapa:");

        btnZacetna.setText("Izberi mapo");
        btnZacetna.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnZacetnaActionPerformed(evt);
            }
        });

        jLabel2.setText("Ciljna mapa:");

        btnCiljna.setText("Izberi mapo");
        btnCiljna.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCiljnaActionPerformed(evt);
            }
        });

        btnRandomize.setText("Naključno izberi datoteke za kopiranje");
        btnRandomize.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRandomizeActionPerformed(evt);
            }
        });

        btnKopiraj.setText("Kopiraj");
        btnKopiraj.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnKopirajActionPerformed(evt);
            }
        });

        jLabel3.setText("Izbrana skupna velikost datotek je:");

        txtVelikost.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtVelikostActionPerformed(evt);
            }
        });

        jLabel4.setText("MB");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(scrlPaneDatoteke, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnZacetna)
                                    .addComponent(btnCiljna))
                                .addGap(27, 27, 27)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(btnKopiraj, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnRandomize, javax.swing.GroupLayout.PREFERRED_SIZE, 205, Short.MAX_VALUE))))
                        .addGap(207, 207, 207))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(txtVelikost, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel4)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrlPaneDatoteke)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnZacetna)
                            .addComponent(btnRandomize))
                        .addGap(18, 18, 18)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnCiljna)
                            .addComponent(btnKopiraj))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 211, Short.MAX_VALUE)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel3)
                            .addComponent(txtVelikost, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel4))))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(0, 10, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 598, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void btnZacetnaActionPerformed(java.awt.event.ActionEvent evt) {                                           
        JFileChooser fileChooser = new JFileChooser();
	fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int zacetnaMapa = fileChooser.showOpenDialog(null);

        if (zacetnaMapa == JFileChooser.APPROVE_OPTION)
        {
            filename = fileChooser.getSelectedFile().getPath();
            Iskanje(filename);
            for (String podmapaVSeznamu : simpleSeznamPodmap) {
                Iskanje(podmapaVSeznamu);
            }
            System.out.println(seznamPodmap);
                      
        }
        else if (zacetnaMapa == JFileChooser.CANCEL_OPTION)
        {   
            JOptionPane.showMessageDialog(null, "Niste izbrali mape.");
        }
        else if (zacetnaMapa == JFileChooser.ERROR_OPTION)
        {
            JOptionPane.showMessageDialog(null, "Ups, pripetila se je napaka.");  
        }     
        
    }                                          

    private void txtVelikostActionPerformed(java.awt.event.ActionEvent evt) {                                            
        SkupnaVelikost = txtVelikost.getText();
    }                                           

    private void btnCiljnaActionPerformed(java.awt.event.ActionEvent evt) {                                          
       JFileChooser fileChooser = new JFileChooser();
	fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int koncnaMapa = fileChooser.showOpenDialog(null);

        if (koncnaMapa == JFileChooser.APPROVE_OPTION)
        {
        koncnaMapaPot = fileChooser.getSelectedFile().getPath();
        }
        else if (koncnaMapa == JFileChooser.CANCEL_OPTION)
        {   
            JOptionPane.showMessageDialog(null, "Niste izbrali mape.");
        }
        else if (koncnaMapa == JFileChooser.ERROR_OPTION)
        {
            JOptionPane.showMessageDialog(null, "Ups, pripetila se je napaka.");  
        }  
    }                                         

    private void btnRandomizeActionPerformed(java.awt.event.ActionEvent evt) {                                             
        Random generatorStevil = new Random();
        int skupnaVel = Integer.parseInt(SkupnaVelikost);
        
        for(int g = 0; g <= skupnaVel; g++ ){
            seznamIndexov.add(generatorStevil.nextInt(seznamMP3.size()+1)); 
        }
        
    }                                            

    private void btnKopirajActionPerformed(java.awt.event.ActionEvent evt) {                                           
       
    }                                          

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(GlavnoOkno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(GlavnoOkno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(GlavnoOkno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(GlavnoOkno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GlavnoOkno().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnCiljna;
    private javax.swing.JButton btnKopiraj;
    private javax.swing.JButton btnRandomize;
    private javax.swing.JButton btnZacetna;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane scrlPaneDatoteke;
    private javax.swing.JTextField txtVelikost;
    // End of variables declaration                   
}

švrk ::

Živjo,

jaz imam spisan en programček, ki dela podobno zadevo. Prebere izbran folder in v jTable izpiše vse Pathe od datotek, ki se nahajajo v izbrani mapi in podmapah. Tukaj je delček te kode, ki to naredi:
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
        JFileChooser chooser1 = new JFileChooser();        
        chooser1.setDialogTitle("Original Folder");
        chooser1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser1.showOpenDialog(chooser1);
        DefaultTableModel tm = (DefaultTableModel) jTable4.getModel();
        //Pot izbrane mape nastavim v textfield
        deafaultTable5();
        try {
            File f = chooser1.getSelectedFile();
            if (f != null && f.exists()) {
                jTextField2.setText(f.getAbsolutePath());
                if (jTextField3.getText().length() > 1) {
                    for (int i = jTable4.getRowCount() - 1; i >= 0; i--) {
                        tm.removeRow(i);
                    }
                    izpisiSynchroFolder(f, jTextField3.getText());
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

in še funkcija

private void izpisiSynchroFolder(File f, String text) {
        DefaultTableModel tm = (DefaultTableModel) jTable4.getModel();
        String FileN = "";
        String Path = "";
        String Target = "";
        String Size = "";
        try {
            File[] vsi = f.listFiles();
            if (vsi != null) {
                for (int i = 0; i < vsi.length; i++) {
                    //Najprej pogledam ali gre za file, če ja ga skopiram
                    if (vsi[i].isFile()) {
                        FileN = vsi[i].getName();
                        Path = vsi[i].getPath();
                        Target = text + "\\" + vsi[i].getName();
                        Size = longToSize(vsi[i].length());
                        tm.addRow(new Object[]{new String(FileN), new String(Path), new String(Target), new String(Size)});
                    } //Če gre za direktorij ga ustvarim v destinaciji
                    else if (vsi[i].isDirectory()) {
                        FileN = vsi[i].getName();
                        Path = vsi[i].getPath();
                        Target = text + "\\" + vsi[i].getName();
                        Size = longToSize(vsi[i].length());
                        tm.addRow(new Object[]{new String(FileN), new String(Path), new String(Target), new String(Size)});
                        izpisiSynchroFolder(vsi[i], Target);
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }


lp

GeForce ::

Hvala, vendar mi je tačas uspelo ta problem rešiti....@švrk bom vseeno pregledal tvojo kodo, že ze zaradi tega ker zgleda bolj berljiva in enostavna :)

Imam pa seveda sedaj drug problem....hočem pa datoteke kopirati s pomočjo naslednje metode
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}


In ne vem kako naj argumente podam kot File?

Seznam datotek imam v
ArrayList<File> seznamMP3File = new ArrayList<>();
(se pravi so pravega tipa?), ampak nevem kako naj neko določeno datoteko podam v argument metode za kopiranje? Ter kaj naj določim kot cilj (ciljno mapo imam trenutno shranjeno kot pot v Stringu)?

švrk ::

Jaz imam kopiranje narejeno na sledeč način.
Ko imam izbrane file in destinacijo stisnem ta event:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        int mape = 0;
        int fili = 0;
        long byti = 0;
        DefaultTableModel tm = (DefaultTableModel) jTable1.getModel();
        
        try {
            for (int i = 0; i < jTable1.getRowCount(); i++) { //dobim število vrstic
                File src = new File(jTable1.getValueAt(i, 1).toString());//preberem 2 stolpec v vrstici i
                File dest = new File(jTable1.getValueAt(i, 3).toString());//preberem 4 stolpec v vrstici i, kjer je zapisana destinacija
                if (src.isDirectory()) {//če je file direktorij, pogledam če v destinaciji ta direktorij obstaja, če ne ga ustvarim
                    if (!dest.exists()) {
                        mape++;
                        dest.mkdir();
                    }
                }
                if (src.isFile()) {//če gre za file in v destinaciji ne obstaja ga skopiram
                    if (!dest.exists()) {
                        fili++;
                        byti = byti + src.length();
                        copyFiles(src.toString(), dest.toString());
                    } else if (dest.exists() && compareFile(src.getPath(), dest.getPath()) == false) {
                        for (int j = 1; j < 10000; j++) {
                            String parent = dest.getParent();
                            String fileName = dobiIme(dest.getName());//ime brez končnice
                            String koncnica = getExtension(dest.getName());//dobi končnico fila
                            File trenutni = new File(parent + "\\" + fileName + " (" + j + ")" + "." + koncnica);
                            if (!trenutni.exists()) {
                                fili++;
                                byti = byti + src.length();
                                copyFiles(src.toString(), trenutni.toString());
                                jTable1.setValueAt(trenutni.toString(), i, 3);
                                break;
                            }
                        }
                     }
                }
            }
            jTable3.setValueAt(mape + " of " + jTable2.getValueAt(0, 1), 0, 1);
            jTable3.setValueAt(fili + " of " + jTable2.getValueAt(1, 1), 1, 1);
            jTable3.setValueAt(longToSize(byti) + " of " + jTable2.getValueAt(2, 1), 2, 1);

} catch (Exception e) {
            System.out.println(e);
        }
    }                                  


in še funkcija, ki dejansko skopira file:

private void copyFiles(String src, String dest) {
        try {
            File f1 = new File(src); //izbran file
            File f2 = new File(dest);//izbrana destinacija
            InputStream in = new FileInputStream(f1);
            OutputStream out = new FileOutputStream(f2);
            //bit za bitom prepišem file
            byte[] buf = new byte[1024];
            int len;
            long size = f1.length();
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            f2.setLastModified(f1.lastModified());
        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(rootPane, ex.getMessage());
            //System.exit(0);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(rootPane, e.getMessage());
        }
    }

nightrage ::

To moraš rešiti z rekurzijo.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142193 (1317) urosz
»

[Java] Podatkovni tip

Oddelek: Programiranje
233831 (3483) piki12
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101461 (1208) Spura
»

[Java] Urejanje baze z JTable

Oddelek: Programiranje
81020 (804) vonNeumann
»

Rekurzija v javi z ArrayList

Oddelek: Programiranje
81588 (1431) marjan_h

Več podobnih tem