Avatar billede axe2 Nybegynder
05. juni 2002 - 00:10 Der er 14 kommentarer og
2 løsninger

kopiere filer

hvordan kopiere man en fil i java, f.eks


c:\fil.doc -> c:\nymappe\fil.doc
Avatar billede bearhugx Nybegynder
05. juni 2002 - 00:32 #1
Her er en bean til at gøre det med

package com.skroeder.beans.util;
import java.io.*;

public class FileCopy {

  public static void copy(String from_name, String to_name) throws IOException{
    File from_file = new File(from_name);  // Get File objects from Strings
    File to_file = new File(to_name);
   
    // First make sure the source file exists, is a file, and is readable.
    if (!from_file.exists())
      abort("FileCopy: no such source file: " + from_name);
    if (!from_file.isFile())
      abort("FileCopy: can't copy directory: " + from_name);
    if (!from_file.canRead())
      abort("FileCopy: source file is unreadable: " + from_name);
   
    // If the destination is a directory, use the source file name
    // as the destination file name
    if (to_file.isDirectory())
      to_file = new File(to_file, from_file.getName());
   
    String parent = to_file.getParent();  // Get the destination directory
    File dir = new File(parent);          // Convert it to a file.
    if (!dir.exists())
        abort("FileCopy: destination directory doesn't exist: " + parent);
    if (dir.isFile())
        abort("FileCopy: destination is not a directory: " + parent);
    if (!dir.canWrite())
        abort("FileCopy: destination directory is unwriteable: " + parent);

    FileInputStream from = null;  // Stream to read from source
    FileOutputStream to = null;  // Stream to write to destination
    try {
      from = new FileInputStream(from_file);  // Create input stream
      to = new FileOutputStream(to_file);    // Create output stream
      byte[] buffer = new byte[4096];        // A buffer to hold file contents
      int bytes_read;                        // How many bytes in buffer
      while((bytes_read = from.read(buffer)) != -1) // Read bytes until EOF
        to.write(buffer, 0, bytes_read);            //  write bytes
    }
    // Always close the streams, even if exceptions were thrown
    finally {
      if (from != null) try { from.close(); } catch (IOException e) { ; }
      if (to != null) try { to.close(); } catch (IOException e) { ; }
    }
  }

  /** A convenience method to throw an exception */
  private static void abort(String msg) throws IOException {
    throw new IOException(msg);
  }
}
Avatar billede bearhugx Nybegynder
05. juni 2002 - 00:36 #2
Alt indtil
  FileInputStream from = null
er bare for at sikre at forholdende er ok (dvs. at filen, som skal kopieres faktisk eksisterer og at der ikke forsøges at overskrive en skrivebeskyttet fil etc.)

try-catch blokken laver så en til og fra stream...
Læser fra fra-streamen og skriver til til-streamen med 4k per gang inden til den møder EOF (End-Of-File)

Håber du kan bruge den :-)

/Søren Munk Skrøder
Avatar billede axe2 Nybegynder
05. juni 2002 - 00:44 #3
while((bytes_read = from.read(buffer)) != -1)
hvad sker der her
Avatar billede Slettet bruger
05. juni 2002 - 00:58 #4
Så længe at det der noget at læse fra filen vil den returnere en positiv (+) værdi, når den når enden af filen og forsøger at læse ud over enden returneres der en negativ værdi, nemlig -1. På den måde kan man "måle" på om man er færdig med at læse filen
Avatar billede bearhugx Nybegynder
05. juni 2002 - 01:43 #5
Tak Maximus :-)

Ved at teste for en negativ værdi (mere specifikt -1) kan man teste om man nu er nået til slutningen af filen.

While-løkken vil tage "bidder" af 4k fra kilde-filen og putte i kopi-filen indtil der ikke er fler "bidder" at tage af. og det finder den ud af ved at opdage at den har læst -1 bytes fra kildefilen

/Søren
Avatar billede bearhugx Nybegynder
05. juni 2002 - 01:47 #6
For at vise, hvordan du kan bruge Beanen, så er her et eksempel

import com.skroeder.bean.util.FileCopy;
class CopyTest
{
  public static void main(String args[])
  {
    /* Da copy er en statisk metode, behøves der ikke at laves et nyt */
    /* instantieret FileCopy-objekt. Metoden kan bruges som følger */

    /* Dette eksempel vil kopierer "C:\autoexec.bat" til a:-drevet */
    FileCopy.copy("c:\\autoexec.bat", "a:\\");   
  }
}
Avatar billede disky Nybegynder
05. juni 2002 - 02:35 #7
denne her flytter et directory og alt derunder, kig på den

/*
* dirMove.java
*
* Created on 23. november 2000, 11:13
*/

import java.io.*;
import java.lang.*;
import java.util.*;


/**
*
* @author  reinke
* @version
*/
public class dirMove extends Object
{
    /** The error code
    */
    private int error=0;

    File sourceDir,destDir;
   
    public dirMove()
    {
    }
   
    /** Moves directory from source to dest including everything beneath it
    * @param source The filepath to the source directory
    * @param dest The filepath to the destination
    * @return According to result of the moving of the directory
    */
    public boolean move(String source, String dest)
    {
        //check if either source or dest is empty or null
        if ( (source.trim().length()==0) || (source==null) || (dest.trim().length()==0) || (dest==null) )
        {
            error=1;
            return false;
        }
       
        sourceDir=new File(source);
       
        if(!sourceDir.isDirectory())
        {
            error=2;
            return false;
        }

        destDir=new File(dest);
       
        if(destDir.exists())
        {
            error=3;
            return false;
        }

        if(source.endsWith("/"))
        {
            source=source.substring(0,source.length()-1);
        }

        if(dest.endsWith("/"))
        {
            dest=dest.substring(0,dest.length()-1);
        }
   
        //some error has happened
        if(!moveIt(source,dest))
        {
            deleteDirs(dest);
        }
        return true;
    }

    public void deleteDirs(String dest)
    {
        File dFile=new File(dest);

        File files[]=scanDir(dFile);
       
        if(files.length!=0)
        {
            for(int x=0;x<files.length;x++)
            {
                String name=files[x].getName();
               
                if(files[x].isDirectory())
                {
                    deleteDirs(dest+"/"+name);
                    files[x].delete();
                }
                else
                {
                    files[x].delete();
                }
            }
        }
        else
        {
            dFile.delete();
        }
    }
   
    private boolean moveIt(String source, String dest)
    {
        File sFile=new File(source);
        File dFile=new File(dest);
       
        if(!dFile.mkdirs())
        {
            error=4;
            return false;
        }
     
        File files[]=scanDir(sFile);
       
        if(files.length!=0)
        {
            for(int x=0;x<files.length;x++)
            {
                String name=files[x].getName();
               
                if(files[x].isDirectory())
                {
                    moveIt(source+"/"+name,dest+"/"+name);
                }
                else
                {
                    if(!copyFile(source+"/"+name,dest+"/"+name))
                    {
                        error=5;
                        return false;
                    }
                }
            }
        }
        return true;
    }
   
    /**
    * @param dir
    * @return  */
    private File [] scanDir(File dir)
    {
        return dir.listFiles();
    }
   
    private boolean copyFile(String source, String dest)
    {
        try
        {
//            FileInputStream in=new FileInputStream(new File(source));
//            FileOutputStream out=new FileOutputStream(new File(dest));
            BufferedInputStream in=new BufferedInputStream(new FileInputStream(new File(source)));
            BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File(dest)));
           
            int data;
           
            while((data=in.read())!=-1)
            {
                out.write(data);
            }
           
            in.close();
            out.close();
        }
        catch (IOException e)
        {
            return false;
        }
        return true;
    }
   
    /** Returns the error text according to the value of 'error'
    * @return String containing the Error Text according to the value of {@link error}
    */
    public String getError()
    {
        if(error==1) return "source eller dest er tom";
        if(error==2) return "source er ikke en directory";
        if(error==3) return "destination findes allerede!!!";
        if(error==4) return "Could not create Directory";
        if(error==5) return "File copy failed";
        return "";
    }
}
Avatar billede axe2 Nybegynder
05. juni 2002 - 10:09 #8
tak for svarene
Avatar billede bearhugx Nybegynder
05. juni 2002 - 10:59 #9
OK :-)
Avatar billede axe2 Nybegynder
05. juni 2002 - 11:49 #10
egenligt volder din Bean, lidt problemer, den laver af og til nogle filerne om til 0 kb størrelse, er det bufferen der er for lille
Avatar billede bearhugx Nybegynder
05. juni 2002 - 11:55 #11
??? Jeg har aldrig haft problemer med den....

Gider du, hvis muligt, at beskrive de situationer, hvor den laver "rav i den"... Hvorfor konkluderer du, at bufferen er for lille ?

/Søren
Avatar billede axe2 Nybegynder
05. juni 2002 - 12:02 #12
Nej jeg skulle måske også teste den af på en disk der rumme filerne først inden jeg brokker mig, Sorry vender tilbage hvis jeg finder en fejl,

Ang. bufferen ja Søren så er jeg grøn på området så hvis du gad at forklare hvad der sker så ville det være iorden,

jeg konkluderer intet men tænkte at det måske var der fejlen lå men det er det jo ikke, bare min egen iver for at få lortet til at køre osv
Avatar billede bearhugx Nybegynder
05. juni 2002 - 12:07 #13
Hvad der sker, når der er buffer på ?
Avatar billede axe2 Nybegynder
05. juni 2002 - 12:09 #14
Sorry Sorry Det virker jeg flyttede store mængder data, så skulle tjekke om pladsen var der først

Din Bean er OK
Avatar billede bearhugx Nybegynder
05. juni 2002 - 12:11 #15
i mit svar, i går kl. 1:47, skal jeg lige nævne, at jeg har glemt at sætte
  FileCopy.copy(...)

i en try-catch-blok.

Dette skal gøres, da FileCopy.copy kan kaste IOException.

/Søren
Avatar billede axe2 Nybegynder
05. juni 2002 - 12:13 #16
Jeps er gjort
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester