जावा में एक डायरेक्टरी से दूसरी डायरेक्टरी में फाइल कॉपी करना


156

मैं जावा का उपयोग करके फ़ाइलों को एक निर्देशिका से दूसरी (उपनिर्देशिका) में कॉपी करना चाहता हूं। मेरे पास एक निर्देशिका है, पाठ फ़ाइलों के साथ डीआईआर। मैं dir में पहले 20 फ़ाइलों पर पुनरावृत्ति करता हूं, और उन्हें dir निर्देशिका में किसी अन्य निर्देशिका में कॉपी करना चाहता हूं, जिसे मैंने पुनरावृत्ति से ठीक पहले बनाया है। कोड में, मैं review(जो ith पाठ फ़ाइल या समीक्षा का प्रतिनिधित्व करता है) की प्रतिलिपि बनाना चाहता हूं trainingDir। मैं यह कैसे कर सकता हूँ? ऐसा लगता है कि ऐसा कोई समारोह नहीं है (या मुझे नहीं मिला)। धन्यवाद।

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
    File review = reviews[i];

}

तो, आपके पास फ़ाइलों से भरा एक निर्देशिका है और आप इन फ़ाइलों को कॉपी करना चाहते हैं? इनपुट पक्ष पर कोई पुनरावृत्ति नहीं है - जैसे सबडिर से सब कुछ एक मुख्य डायर में कॉपी करें?
१२:०२ पर ऐकर्नोकड

हाँ बिल्कुल। मुझे इन फ़ाइलों को किसी अन्य निर्देशिका में कॉपी करने या स्थानांतरित करने में दिलचस्पी है (हालांकि पोस्ट में मैंने केवल कॉपी करने के लिए कहा है)।
user42155

3
भविष्य से अपडेट करें। जावा 7 में फाइल कॉपी करने के लिए फाइल क्लास से एक फीचर है । यहाँ इसके बारे में एक और पोस्ट है stackoverflow.com/questions/16433915/…
केविनL

जवाबों:


170

अभी के लिए यह आपकी समस्या को हल करना चाहिए

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
    FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
    e.printStackTrace();
}

FileUtilsApache commons-io पुस्तकालय से कक्षा , संस्करण 1.2 के बाद से उपलब्ध है।

हमारे द्वारा सभी उपयोगिताओं को लिखने के बजाय तीसरे पक्ष के टूल का उपयोग करना एक बेहतर विचार है। यह समय और अन्य मूल्यवान संसाधनों को बचा सकता है।


FileUtils मेरे लिए काम नहीं किया। स्रोत मैंने "E: \\ Users \\ users.usr" और गंतव्य को "D: \\ users.usr" के रूप में लिया। क्या समस्या हो सकती है?
जावा

2
अच्छा समाधान, मेरे लिए, यह तब काम करता है जब मैं बदल FileUtils.copyDirectory(source,dest)जाता हूं FileUtils.copyFile(source, dest), यह निर्देशिका बना सकता है यदि यह मौजूद नहीं है
युकीझंग

FileUtils.copyDirectory केवल निर्देशिका में फ़ाइलों को कॉपी करता है उपनिर्देशिका को नहीं। FileUtils.copyDirectoryStructure सभी फ़ाइलों और उपनिर्देशिकाओं की प्रतिलिपि बनाता है
Homayoun Behzadian

41

मानक एपीआई (अभी तक) में कोई फाइल कॉपी विधि नहीं है। आपके विकल्प हैं:

  • FileInputStream, FileOutputStream और बफ़र को एक से दूसरे में कॉपी करने के लिए बफर का उपयोग करके, इसे स्वयं लिखें - या बेहतर अभी तक, FileChannel.transferTo () का उपयोग करें
  • उपयोगकर्ता अपाचे कॉमन्स ' FileUtils
  • जावा 7 में NIO2 की प्रतीक्षा करें

NIO2 के लिए +1: मैं इन दिनों NIO2 / Java7 के साथ प्रयोग कर रहा हूं .. और नया पथ बहुत अच्छी तरह से इंजीनियर है
dfa

ठीक है, यह जावा 7 में कैसे करें? NIO2 लिंक अब टूट गया है।
ripper234

5
@ ripper234: लिंक ठीक किया गया। ध्यान दें कि मुझे Google में "java nio2" दर्ज करके नया लिंक मिला ...
माइकल

Apache Commons लिंक के लिए, मुझे लगता है कि आपको "#copyDirectory (java.io.File, java.io.File)" से लिंक करने का मतलब है
kostmo

37

जावा 7 में, वहाँ है जावा में फ़ाइलों की प्रतिलिपि बनाने के लिए एक मानक विधि:

Files.copy।

यह उच्च प्रदर्शन के लिए ओ / एस मूल I / O के साथ एकीकृत करता है।

जावा में किसी फ़ाइल को कॉपी करने के लिए मानक संक्षिप्त तरीके पर मेरा ए देखें ? उपयोग के पूर्ण विवरण के लिए।


6
यह पूरी निर्देशिका को कॉपी करने के प्रश्न को संबोधित नहीं करता है।
चार्ली

हाँ यह करता है ... यदि आप लिंक का अनुसरण करते हैं। यह मत भूलो कि जावा में एक "फ़ाइल" एक निर्देशिका या फ़ाइल का प्रतिनिधित्व कर सकता है, यह केवल एक संदर्भ है।
गागरवा

"यदि फ़ाइल एक निर्देशिका है तो यह लक्ष्य स्थान में एक खाली निर्देशिका बनाता है (निर्देशिका में प्रविष्टियाँ कॉपी नहीं की जाती हैं")
yurez

27

जावा टिप्स से नीचे का उदाहरण बल्कि सीधे आगे है। मैंने तब से फ़ाइल सिस्टम से निपटने के लिए ग्रूवी में स्विच किया है - बहुत आसान और सुरुचिपूर्ण। लेकिन यहां जावा टिप्स एक है जिसका मैंने अतीत में उपयोग किया था। इसके पास मजबूत अपवाद हैंडलिंग का अभाव है जो इसे मूर्ख बनाने के लिए आवश्यक है।

 public void copyDirectory(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }
    }

धन्यवाद, लेकिन मैं निर्देशिका को कॉपी नहीं करना चाहता - केवल इसमें फाइलें। अब मुझे त्रुटि संदेश java.io.ile.FileNotFoundException: (trDir का पथ) (एक निर्देशिका है) यह वही है जो यह कहता है। मैंने इस तरह की विधि का उपयोग किया है: copyDirectory (समीक्षा, trDir);
user42155

धन्यवाद, अगर जाँच करने के लिए बेहतर है कि sourceLocation.exists()रोकने के लिएjava.io.FileNotFoundException
Sdghasemi

19

यदि आप किसी फ़ाइल को कॉपी करना चाहते हैं और उसे स्थानांतरित नहीं करना चाहते हैं तो आप इस तरह से कोड कर सकते हैं।

private static void copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!sourceFile.exists()) {
        return;
    }
    if (!destFile.exists()) {
        destFile.createNewFile();
    }
    FileChannel source = null;
    FileChannel destination = null;
    source = new FileInputStream(sourceFile).getChannel();
    destination = new FileOutputStream(destFile).getChannel();
    if (destination != null && source != null) {
        destination.transferFrom(source, 0, source.size());
    }
    if (source != null) {
        source.close();
    }
    if (destination != null) {
        destination.close();
    }

}

नमस्ते, मैंने यह कोशिश की है, लेकिन मैं त्रुटि संदेश प्राप्त करता हूं: java.io.ile.FotNotFoundException: ... trDir के लिए पथ ... (एक निर्देशिका है) मेरी फ़ाइल और फ़ोल्डर्स में सब कुछ ठीक प्रतीत होता है। क्या आप जानते हैं कि यह क्या गलत है, और मुझे यह क्यों मिला?
user42155

लेकिन क्या कोई विंडोज बग ट्रांसफर के आसपास नहीं है? Bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 rgagnon.com/javadetails/java-0064.html
akarnokd

मैं Ubuntu 8.10 का उपयोग कर रहा हूं, इसलिए यह समस्या नहीं होनी चाहिए।
user42155

यदि आप सुनिश्चित हैं कि आपका कोड अलग-अलग प्लेटफ़ॉर्म पर नहीं चलेगा।
एकरनोकड

@gemm को सही पथ होना चाहिए फ़ाइल को कॉपी किया जाना चाहिए। इसका मतलब यह है कि नए फ़ाइलनाम सहित न केवल निर्देशिका जिसे आप फ़ाइल की प्रतिलिपि बनाना चाहते हैं।
Janusz

18

स्प्रिंग फ्रेमवर्क में Apache Commons Lang जैसे कई उपयोग वर्ग हैं। इसलिय वहाँ हैorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);

15

एपाचे कॉमन्स Fileutils काम है। आप नीचे की गतिविधियाँ कर सकते हैं।

  1. फाइल को एक डायरेक्टरी से दूसरी डायरेक्टरी में कॉपी करना।

    उपयोग copyFileToDirectory(File srcFile, File destDir)

  2. निर्देशिका को एक निर्देशिका से दूसरी निर्देशिका में कॉपी करना।

    उपयोग copyDirectory(File srcDir, File destDir)

  3. एक फ़ाइल की सामग्री को दूसरे में कॉपी करना

    उपयोग static void copyFile(File srcFile, File destFile)


9
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());

FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
                destinationFile);

int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
    fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();

1
साफ, सरल जवाब - कोई अतिरिक्त निर्भरता नहीं।
3

कृपया आप पहले 2 पंक्तियों का वर्णन कर सकते हैं!
AVA


8

Apache commons FileUtils काम में आएगी, अगर आप चाहते हैं कि स्रोत से फ़ाइलों को स्थानांतरित करने के बजाय पूरी निर्देशिका की प्रतिलिपि बनाएँ, तो आप पूरी निर्देशिका की प्रतिलिपि बना सकते हैं:

for (File srcFile: srcDir.listFiles()) {
    if (srcFile.isDirectory()) {
        FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
    } else {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

यदि आप निर्देशिकाओं को छोड़ना चाहते हैं, तो आप कर सकते हैं:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

2
copyFileToDirectory फ़ाइल को "स्थानांतरित" नहीं करती
aleb

7

आप सरल समाधान (एक अच्छी बात) की तलाश में हैं। मैं Apache Common की FileUtils.copyDirectory का उपयोग करने की सलाह देता हूं :

फ़ाइल तिथियों को संरक्षित करने के लिए एक पूरी निर्देशिका को एक नए स्थान पर कॉपी करता है।

यह विधि निर्दिष्ट निर्देशिका और उसके सभी बच्चे निर्देशिकाओं और फ़ाइलों को निर्दिष्ट गंतव्य पर कॉपी करती है। गंतव्य निर्देशिका का नया स्थान और नाम है।

यदि यह मौजूद नहीं है तो गंतव्य निर्देशिका बनाई गई है। यदि गंतव्य निर्देशिका मौजूद थी, तो यह विधि गंतव्य के साथ स्रोत को विलय कर देती है, स्रोत पूर्वता लेने के साथ।

आपका कोड इस तरह अच्छा और सरल हो सकता है:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");

FileUtils.copyDirectory(srcDir, trgDir);

नमस्ते, मैं निर्देशिका को कॉपी नहीं करना चाहता - केवल इसमें फाइलें।
user42155

यह मूल रूप से एक ही बात है, नहीं? स्रोत निर्देशिका से सभी फाइलें लक्ष्य निर्देशिका में समाप्त हो जाएंगी।
स्टु थॉम्पसन

1
यह पढ़ने और फिर फ़ाइलों को लिखने की तुलना में कहीं बेहतर विधि है। +1
ऑप्टिमस प्राइम

6

इस सूत्र में मोहित के जवाब से प्रेरित है । केवल जावा 8 के लिए लागू।

निम्नलिखित का उपयोग एक फ़ोल्डर से दूसरे में पुनरावर्ती रूप से सब कुछ कॉपी करने के लिए किया जा सकता है:

public static void main(String[] args) throws IOException {
    Path source = Paths.get("/path/to/source/dir");
    Path destination = Paths.get("/path/to/dest/dir");

    List<Path> sources = Files.walk(source).collect(toList());
    List<Path> destinations = sources.stream()
            .map(source::relativize)
            .map(destination::resolve)
            .collect(toList());

    for (int i = 0; i < sources.size(); i++) {
        Files.copy(sources.get(i), destinations.get(i));
    }
}

स्ट्रीम-शैली FTW।

अपडेट 2019-06-10: महत्वपूर्ण नोट - Files.walk कॉल द्वारा अधिग्रहित स्ट्रीम (जैसे try-with-resource का उपयोग करके) को बंद करें। बिंदु के लिए @jannis को धन्यवाद।


बहुत बढ़िया!! समानांतर स्ट्रीम का उपयोग करें यदि कोई निर्देशिका को कॉपी करना चाहता है जिसमें लाखों फ़ाइल हैं। मैं फ़ाइलों की प्रतिलिपि बनाने की प्रगति को आसानी से दिखा सकता हूं, लेकिन JAVA 7 nio copyDirectory कमांड में, बड़ी निर्देशिका के लिए मैं उपयोगकर्ताओं के लिए प्रगति दिखाने में असमर्थ था।
अकील हैदर

1
मेरा सुझाव Files.walk(source)है कि डॉक्स में
बताई

4

नीचे ब्रायन का संशोधित कोड है जो स्रोत स्थान से गंतव्य स्थान तक फ़ाइलों को कॉपी करता है।

public class CopyFiles {
 public static void copyFiles(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }
            File[] files = sourceLocation.listFiles();
            for(File file:files){
                InputStream in = new FileInputStream(file);
                OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());

                // Copy the bits from input stream to output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
            }            
        }
    }

4

जावा 8

Path sourcepath = Paths.get("C:\\data\\temp\\mydir");
        Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");        
        Files.walk(sourcepath)
             .forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source)))); 

कॉपी विधि

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

3

आप स्रोत फ़ाइल को नई फ़ाइल में कॉपी करने और मूल को हटाने के लिए समाधान कर सकते हैं।

public class MoveFileExample {

 public static void main(String[] args) {   

    InputStream inStream = null;
    OutputStream outStream = null;

    try {

        File afile = new File("C:\\folderA\\Afile.txt");
        File bfile = new File("C:\\folderB\\Afile.txt");

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;
        //copy the file content in bytes 
        while ((length = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }

        inStream.close();
        outStream.close();

        //delete the original file
        afile.delete();

        System.out.println("File is copied successful!");

    } catch(IOException e) {
        e.printStackTrace();
    }
 }
}

2

उपयोग

org.apache.commons.io.FileUtils

यह इतना आसान है


4
यदि आप एक पुस्तकालय का सुझाव देने वाले उत्तर को पोस्ट करने जा रहे हैं, तो यह अच्छा होगा यदि आप वास्तव में बताएंगे कि इसका उपयोग केवल इसके नाम का उल्लेख करने के बजाय कैसे किया जाए।
पोप

2
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){    
    System.out.println(file.getName());

    try {
        String sourceFile=dir+"\\"+file.getName();
        String destinationFile="D:\\mital\\storefile\\"+file.getName();
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        FileOutputStream fileOutputStream = new FileOutputStream(
                        destinationFile);
        int bufferSize;
        byte[] bufffer = new byte[512];
        while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
            fileOutputStream.write(bufffer, 0, bufferSize);
        }
        fileInputStream.close();
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


1

मैं अपलोड किए गए कोड को CommonMultipartFileएक फ़ोल्डर में स्थानांतरित करने के लिए और उस फाइल को एक गंतव्य फ़ोल्डर में webapps (यानी) वेब प्रोजेक्ट फ़ोल्डर में कॉपी करने के लिए उपयोग करता हूं ,

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();

    File file = new File(resourcepath);
    commonsMultipartFile.transferTo(file);

    //Copy File to a Destination folder
    File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
    FileUtils.copyFileToDirectory(file, destinationDir);

1

फाइल को एक डायरेक्टरी से दूसरी डायरेक्टरी में कॉपी करें ...

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();

1

यहाँ बस एक फ़ोल्डर से दूसरे में डेटा कॉपी करने के लिए एक जावा कोड है, आपको बस स्रोत और गंतव्य का इनपुट देना होगा।

import java.io.*;

public class CopyData {
static String source;
static String des;

static void dr(File fl,boolean first) throws IOException
{
    if(fl.isDirectory())
    {
        createDir(fl.getPath(),first);
        File flist[]=fl.listFiles();
        for(int i=0;i<flist.length;i++)
        {

            if(flist[i].isDirectory())
            {
                dr(flist[i],false);
            }

            else
            {

                copyData(flist[i].getPath());
            }
        }
    }

    else
    {
        copyData(fl.getPath());
    }
}

private static void copyData(String name) throws IOException {

        int i;
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        System.out.println(str);
        FileInputStream fis=new FileInputStream(name);
        FileOutputStream fos=new FileOutputStream(str);
        byte[] buffer = new byte[1024];
        int noOfBytes = 0;
         while ((noOfBytes = fis.read(buffer)) != -1) {
             fos.write(buffer, 0, noOfBytes);
         }


}

private static void createDir(String name, boolean first) {

    int i;

    if(first==true)
    {
        for(i=name.length()-1;i>0;i--)
        {
            if(name.charAt(i)==92)
            {
                break;
            }
        }

        for(;i<name.length();i++)
        {
            des=des+name.charAt(i);
        }
    }
    else
    {
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        (new File(str)).mkdirs();
    }

}

public static void main(String args[]) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("program to copy data from source to destination \n");
    System.out.print("enter source path : ");
    source=br.readLine();
    System.out.print("enter destination path : ");
    des=br.readLine();
    long startTime = System.currentTimeMillis();
    dr(new File(source),true);
    long endTime   = System.currentTimeMillis();
    long time=endTime-startTime;
    System.out.println("\n\n Time taken = "+time+" mili sec");
}

}

आप जो चाहते हैं, उसके लिए यह एक काम करने वाला कोड है


आप CopyData में FileInputStream और FileOutputStream को बंद करना भूल गए।
सदाबहार

0

आप फ़ाइलों को एक निर्देशिका से दूसरी निर्देशिका में कॉपी करने के लिए निम्न कोड का उपयोग कर सकते हैं

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
     // recursively copy all the files of src folder if src is a directory
     if( src.isDirectory() ) {
         // creating parent folders where source files is to be copied
         dest.mkdirs();
         for( File sourceChild : src.listFiles() ) {
             File destChild = new File( dest, sourceChild.getName() );
             copyTo( sourceChild, destChild );
         }
     } 
     // copy the source file
     else {
         InputStream in = new FileInputStream( src );
         OutputStream out = new FileOutputStream( dest );
         writeThrough( in, out );
         in.close();
         out.close();
     }
 }

0
    File file = fileChooser.getSelectedFile();
    String selected = fc.getSelectedFile().getAbsolutePath();
     File srcDir = new File(selected);
     FileInputStream fii;
     FileOutputStream fio;
    try {
         fii = new FileInputStream(srcDir);
         fio = new FileOutputStream("C:\\LOvE.txt");
         byte [] b=new byte[1024];
         int i=0;
        try {
            while ((fii.read(b)) > 0)
            {

              System.out.println(b);
              fio.write(b);
            }
            fii.close();
            fio.close();

क्या है fileChooser?
डिनोप पालोली

0

एक निर्देशिका से दूसरे में फ़ाइलों को कॉपी करने के लिए निम्नलिखित कोड

File destFile = new File(targetDir.getAbsolutePath() + File.separator
    + file.getName());
try {
  showMessage("Copying " + file.getName());
  in = new BufferedInputStream(new FileInputStream(file));
  out = new BufferedOutputStream(new FileOutputStream(destFile));
  int n;
  while ((n = in.read()) != -1) {
    out.write(n);
  }
  showMessage("Copied " + file.getName());
} catch (Exception e) {
  showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
  if (in != null)
    try {
      in.close();
    } catch (Exception e) {
    }
  if (out != null)
    try {
      out.close();
    } catch (Exception e) {
    }
}

0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFiles {
    private File targetFolder;
    private int noOfFiles;
    public void copyDirectory(File sourceLocation, String destLocation)
            throws IOException {
        targetFolder = new File(destLocation);
        if (sourceLocation.isDirectory()) {
            if (!targetFolder.exists()) {
                targetFolder.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        destLocation);

            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
            System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());            
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            noOfFiles++;
        }
    }

    public static void main(String[] args) throws IOException {

        File srcFolder = new File("C:\\sourceLocation\\");
        String destFolder = new String("C:\\targetLocation\\");
        CopyFiles cf = new CopyFiles();
        cf.copyDirectory(srcFolder, destFolder);
        System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
        System.out.println("Successfully Retrieved");
    }
}

0

यह भी जटिल नहीं है और जावा 7 में आवश्यक कोई आयात नहीं है:

renameTo( )विधि एक फ़ाइल का नाम बदल देता है:

public boolean renameTo( File destination)

उदाहरण के लिए, src.txtवर्तमान कार्य निर्देशिका में फ़ाइल का नाम बदलने के लिए dst.txt, आप लिखेंगे:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst); 

बस।

संदर्भ:

हेरोल्ड, इलियट रस्टी (2006-05-16)। जावा I / O (पृष्ठ 393)। ओ'रेली मीडिया। किंडल संस्करण।


2
चल रहा है नकल नहीं कर रहा है।
नाथन टग्गी

यह फ़ाइल को स्थानांतरित करेगा। गलत जवाब !
स्माइलफेस

जैसा कि प्रश्न पर टिप्पणियों में निर्दिष्ट है, चलती ओपी के लिए काम करेगी।
मोहित कंवर

Upvoted, क्योंकि यह मेरी अपनी समस्या के लिए फिट बैठता है और चलती फ़ाइलों के लिए सबसे आसान उत्तर है। धन्यवाद दोस्त
LevKaz

कृपया प्रश्न से संबंधित उत्तर दें
शक्तिसिंह जडेजा

0

आप फ़ाइलों को एक निर्देशिका से दूसरी निर्देशिका में कॉपी करने के लिए निम्न कोड का उपयोग कर सकते हैं

public static void copyFile(File sourceFile, File destFile) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        finally {
            in.close();
            out.close();
        }
    }

0

पुनरावर्ती कार्य के बाद मैंने लिखा है, अगर यह किसी की मदद करता है। यह sourcedirectory के अंदर की सभी फाइलों को गंतव्यDirectory पर कॉपी कर देगा।

उदाहरण:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
    File file = new File(currentPath);
    FileInputStream fi = null;
    FileOutputStream fo = null;

    if (file.isDirectory()) {
        String[] fileFolderNamesArray = file.list();
        File folderDes = new File(destinationPath);
        if (!folderDes.exists()) {
            folderDes.mkdirs();
        }

        for (String fileFolderName : fileFolderNamesArray) {
            rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
        }
    } else {
        try {
            File destinationFile = new File(destinationPath);

            fi = new FileInputStream(file);
            fo = new FileOutputStream(destinationPath);
            byte[] buffer = new byte[1024];
            int ind = 0;
            while ((ind = fi.read(buffer))>0) {
                fo.write(buffer, 0, ind);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if (null != fi) {
                try {
                    fi.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != fo) {
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

0

यदि आप बाहरी पुस्तकालयों का उपयोग नहीं करना चाहते हैं और आप java.nio कक्षाओं के बजाय java.io का उपयोग करना चाहते हैं, तो आप इस संक्षिप्त विधि का उपयोग किसी फ़ोल्डर और उसकी सभी सामग्री की प्रतिलिपि बनाने के लिए कर सकते हैं:

/**
 * Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
 * @param folderToCopy The folder and it's content that will be copied
 * @param folderDestination The folder destination
 */
public static void copyFolder(File folderToCopy, File folderDestination) {
    if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
        throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");

    folderDestination.mkdirs();

    for(File fileToCopy : folderToCopy.listFiles()) {
        File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());

        try (FileInputStream fis = new FileInputStream(fileToCopy);
             FileOutputStream fos = new FileOutputStream(copiedFile)) {

            int read;
            byte[] buffer = new byte[512];

            while ((read = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

0

मेरे ज्ञान के अनुसार सबसे अच्छा तरीका इस प्रकार है:

    public static void main(String[] args) {

    String sourceFolder = "E:\\Source";
    String targetFolder = "E:\\Target";
    File sFile = new File(sourceFolder);
    File[] sourceFiles = sFile.listFiles();
    for (File fSource : sourceFiles) {
        File fTarget = new File(new File(targetFolder), fSource.getName());
        copyFileUsingStream(fSource, fTarget);
        deleteFiles(fSource);
    }
}

    private static void deleteFiles(File fSource) {
        if(fSource.exists()) {
            try {
                FileUtils.forceDelete(fSource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void copyFileUsingStream(File source, File dest) {
        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);
            }
        } catch (Exception ex) {
            System.out.println("Unable to copy file:" + ex.getMessage());
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception ex) {
            }
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.