2017-01-19 1 views
0

몇 가지 도움이 필요합니다. 파일 관리자와 같은 프로그램을 만들고 있습니다. 내 프로그램에서 나는 동시 파일 복사를해야한다. 이를 위해 을 사용하여 JProgressbar에있는 복사본의 진행 상태를 확인하지만 동일한 대상으로 작업의 복사에 파일을 추가하는 방법을 알아야합니다.SwingWorker의 매개 변수 업데이트

내 교장 프로그램에서 Swingworker까지 확장되는 수업입니다. 하나의 대상에서 복사 할 파일이나 폴더를 선택하겠습니다. Copytask이 작동하는 동안 필요한 것은 Copyitem Arraylist에 파일을 더 추가 할 수 있습니다.

제 영어에 대해 도움과 죄송합니다. 여기

import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.JProgressBar; 
import javax.swing.SwingWorker; 
import xray.XRAYView; 


public class CopyTask extends SwingWorker<Void, Integer> 
    { 

     ArrayList<CopyItem>copia; 
     private long totalBytes = 0L; 
     private long copiedBytes = 0L; 
     JProgressBar progressAll; 
     JProgressBar progressCurrent; 
     boolean override=true; 
     boolean overrideall=false; 


     public CopyTask(ArrayList<CopyItem>copia,JProgressBar progressAll,JProgressBar progressCurrent) 
     { 

      this.copia=copia; 
      this.progressAll=progressAll; 
      this.progressCurrent=progressCurrent; 


      progressAll.setValue(0); 
      progressCurrent.setValue(0); 
      totalBytes=retrieveTotalBytes(copia); 

     } 

     public void AgregarCopia(ArrayList<CopyItem>addcopia)throws Exception{ 

      copia.addAll(copia.size(), addcopia); 
      totalBytes=retrieveTotalBytes(addcopia)+totalBytes; 
      System.out.println("AL AGREGAR: "+copia.size()+" Tamaño"+totalBytes); 



     } 

     public File getDriveDest(){ 
     File dest=new File(copia.get(0).getOrigen().getPath().split("\\")[0]); 
     return dest; 
     } 


     @Override 
     public Void doInBackground() throws Exception 
     { 


      for(CopyItem cop:copia){ 

      File ori=cop.getOrigen(); 
      File des=new File(cop.getDestino().getPath()); 
      if(!des.exists()){ 
       des.mkdirs(); 
      } 
      if(!overrideall){ 
      override =true; 
      } 
      File para=new File(cop.getDestino().getPath()+"\\"+ori.getName()); 
      copyFiles(ori, para); 

      } 
      return null; 
     } 

     @Override 
     public void process(List<Integer> chunks) 
     { 
      for(int i : chunks) 
      { 
       progressCurrent.setValue(i); 


      } 
     } 

     @Override 
     public void done() 
     { 
      setProgress(100); 

     } 

     private long retrieveTotalBytes(ArrayList<CopyItem>fich) 
     { 
      long size=0; 
      for(CopyItem cop: fich) 
      { 
       size += cop.getOrigen().length(); 

      } 

      return size; 
     } 






private void copyFiles(File sourceFile, File targetFile) throws IOException 

     { 
        if(overrideall==false){ 
         if(targetFile.exists() && !targetFile.isDirectory()){ 

          String []options={"Si a Todos","Si","No a Ninguno","No"}; 
          int seleccion=JOptionPane.showOptionDialog(null, "El fichero \n"+targetFile+" \n se encuentra en el equipo, \n¿Desea sobreescribirlo?", "Colisión de ficheros", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, null); 

          switch(seleccion){ 
           case 0: 
           override=true; 
           overrideall=true; 
           break; 
           case 1: 
           override=true; 
           overrideall=false; 
           break; 
           case 2: 
           override =false; 
           overrideall=true; 
           break; 
           case 3: 
           override =false; 
           overrideall=false; 
           break; 

          } 

         } 

        } 

        if(override || !targetFile.exists()){ 
        FileInputStream LeeOrigen= new FileInputStream(sourceFile); 

        OutputStream Salida = new FileOutputStream(targetFile); 

        byte[] buffer = new byte[1024]; 
        int tamaño; 

        long fileBytes = sourceFile.length(); 

        long totalBytesCopied = 0; 

        while ((tamaño = LeeOrigen.read(buffer)) > 0) { 

        Salida.write(buffer, 0, tamaño); 

        totalBytesCopied += tamaño; 
        copiedBytes+= tamaño; 

        setProgress((int)Math.round(((double)copiedBytes++/(double)totalBytes) * 100)); 

        int progress = (int)Math.round(((double)totalBytesCopied/(double)fileBytes) * 100); 

        publish(progress); 



        } 


        Salida.close(); 
        LeeOrigen.close(); 



       publish(100); 
       } 


      } 
     } 

import java.io.File; 


public class CopyItem { 
    File origen; 
    File destino; 
    String root; 

    public CopyItem(File origen, File destino) { 
     this.origen = origen; 
     this.destino = destino; 
    } 

    public CopyItem(File origen, File destino, String root) { 
     this.origen = origen; 
     this.destino = destino; 
     this.root = root; 
    } 

    public String getRoot() { 
     return root; 
    } 

    public void setRoot(String root) { 
     this.root = root; 
    } 


    public File getOrigen() { 
     return origen; 
    } 

    public void setOrigen(File origen) { 
     this.origen = origen; 
    } 

    public File getDestino() { 
     return destino; 
    } 

    public void setDestino(File destino) { 
     this.destino = destino; 
    } 

    @Override 
    public String toString() { 
     return super.toString(); //To change body of generated methods, choose Tools | Templates. 
    } 


} 
+0

이 코드의 95 %가 귀하의 질문과 관련이 없다고 생각합니다. 문제를 나타내는 [** Minimal **, Complete and Verifiable Example] (http://stackoverflow.com/help/mcve)을 만드십시오. –

답변

0

예 직접 소스 목록 (목록이 복사 할 파일을 포함)에 파일을 추가 할 수 있습니다 CopyItem 클래스입니다하지만 당신은 더 많은 파일을 추가하면되기 때문에 코드를 동기화해야 다른 스레드 (UI 스레드)에서 다른 방법으로 (생성/소비자)를 구현하는 것입니다 BlockingQueue

개별 스레드 또는 Swingworker 대처 파일에서 실행되는 소비자 클래스가 진행 중입니다. Producer 클래스는 UI 스레드 (다른 파일 선택)를 실행합니다.

모두 BlockingQueue (복사 할 파일 포함)에 액세스해야합니다 (물론 BlockingQueue 구현은 문서를 기반으로 thread 세이프입니다.) 실행을 차단하고 파일이 추가 될 때까지 기다릴 수있는 이점이 있습니다. 파일이 언제 추가되는지 잘 모르는 경우 매우 유용)

스레드 실행을 관리하기 위해 스레드 풀을 사용하는 것이 좋습니다 (선택 사항).

+0

Amjad, 고맙습니다. (소비자/생산자)에 대해 들었습니다.하지만이 경우 어떻게 구현해야할지 모르겠다. 생각이 다른 위협을 복사하는 새로운 addes 파일을 수신하는 하나의 위협에 있다고 생각합니다. 하지만 난 어떻게 사본을 보내고 다른 사람을 보내려면 사본이 끝날 때까지 기다려야하는지 모르겠다, 미리 감사드립니다. –

관련 문제