只有在java中更改了大小、上次修改日期、文件名或文件内容时,才复制文件



我在不同的网络驱动器Q:和K:上有两个文件夹

每天我都会传递一个带有或不带有修订号的文件夹名称,程序会在Q:drive中搜索文件,如果没有修订号,它会将整个文件夹复制到K:drive的文件夹中,如果没有,它会在主文件夹中搜索该修订文件夹,并仅将该文件夹复制到K的文件夹中。

现在我正在复制,没有比较两个文件夹中的文件大小或上次修改日期文件。在进行修改的情况下,如果未检查文件大小,则代码会复制文件夹中的所有文件,这会浪费磁盘上的空间(因为(文件夹)已经有大约20000个文件夹,大小为100GB)。

如何检查文件大小或上次修改日期,如果有任何更改,则复制文件夹?

例如,如果我想在不修改的情况下复制名为123456的文件夹,代码会检查文件夹是否已经存在于目标位置(不检查文件大小等),然后询问是否要覆盖它,然后复制文件。

如果文件夹名称为123456,修订号为2,则代码首先在源文件夹中搜索文件夹123456,然后在修订2文件夹中搜索(文件夹名称本身为修订2),然后复制(如果目标文件夹中存在,则要求覆盖),然后再复制。文件夹修正案0、修正案1和修正案2中的某些文件保持不变。只有少数文件会发生更改。

我不想总是复制普通文件,它们必须只在根文件夹中,只有更改的文件才能复制到修改文件夹中。

我只使用java。这是我的代码

public static void copyFolder(File src, File dest, File destf) throws IOException
    {
             if(src.isDirectory())
            {
                     //if directory does not exist, create it
                     if(!dest.exists())
                    {
                               dest.mkdir();
                               System.out.println("Directory copied from " + src + "  to " + dest);
                    }
                     //list all the directory contents
                     String files[] = src.list();
                     for (String file : files)
                    {
                            //construct the src and dest file structure
                               File srcFile = new File(src, file);
                               File destFile = new File(dest, file);
                               File dst = new File(destf, file);
                            if(((dst.lastModified() - srcFile.lastModified()) == 0) || ((dst.length() - srcFile.length()) == 0))
                            {
                                    int op = JOptionPane.showConfirmDialog(null, srcFile.getName() + " File exists! n Do you want to overwrite it?", "Confirm Window", JOptionPane.YES_NO_OPTION);
                                     if (op == JOptionPane.NO_OPTION)
                                            JOptionPane.showMessageDialog(null, "Copy Canceled");
                                    else
                                            copyFolder(srcFile, destFile, dst);
                            }
                            else
                                    copyFolder(srcFile, destFile, dst);
                     }
             }
            else
            {
                    if(((dest.lastModified() - src.lastModified()) == 0) || ((dest.length() - src.length()) == 0))
                    {
                            int op = JOptionPane.showConfirmDialog(null, src.getName() + " File exists! n Do you want to overwrite it?", "Confirm Window", JOptionPane.YES_NO_OPTION);
                             if (op == JOptionPane.NO_OPTION)
                                    JOptionPane.showMessageDialog(null, "Copy Canceled");
                            else
                            {
                                    InputStream in = new FileInputStream(src);
                               OutputStream out = new FileOutputStream(dest);
                               byte[] buffer = new byte[1024];
                               int length;
                                    while ((length = in.read(buffer)) > 0)
                                    {
                                                 out.write(buffer, 0, length);
                                       }
                               in.close();
                               out.close();
                               System.out.println("File copied from " + src + " to " + dest);
                            }
                    }
                    else
                    {
                            InputStream in = new FileInputStream(src);
                       OutputStream out = new FileOutputStream(dest);
                       byte[] buffer = new byte[1024];
                       int length;
                            while ((length = in.read(buffer)) > 0)
                            {
                                         out.write(buffer, 0, length);
                               }
                       in.close();
                       out.close();
                       System.out.println("File copied from " + src + " to " + dest);
                    }
             }
     }

如何检查文件大小

File#length()

或最后修改日期

File#lastModified()

复制文件的不同方法的一些示例,包括性能时间:http://examples.javacodegeeks.com/core-java/io/file/4-ways-to-copy-file-in-java/

与此主题相关的stackoverflow回答:用Java复制文件的标准简洁方式?

但您可以将file1.lastModified() != file2.lastModified()用作简单的日期检查,也可以将.length用作长度检查。

File f1 = new File("c:testaaatemp.txt"); 
File f2 = new File("d:testaaatemp.txt");
// Same modify date?
if ((f1.lastModified() != f2.lastModified()) || (f1.length() != f2.length())) {
    // add to copy list
}

您需要小心最后修改的日期,因为您没有完全按照原样复制,例如linux cp -a命令。相反,你像往常一样复制文件,即在文件的位置创建一个新文件,并将内容流式传输到文件中。在这种情况下,.length()就足够了。您总是可以生成文件的CRC32或MD5哈希来检查内容是否匹配。然而,如果您要复制非常大或数千个文件,这是一个缓慢的过程。

编辑

由于上次修改日期对您来说是一个重要的检查,并且您需要保留复制文件的上次修改日期属性,因此您可以通过以下方式手动设置:

File f1 = new File("c:testaaatemp.txt"); 
File f2 = new File("d:testaaatemp.txt");
if (!f1.exists()) {
    // throw an exception
}
// Copy the file as is, retain attributes, replace existing
CopyOption[] options = new CopyOption[] {COPY_ATTRIBUTES, REPLACE_EXISTING};
if (f2.exists()) {
    if ((f1.lastModified() != f2.lastModified()) || (f1.length() != f2.length()) {
        Files.copy(f1, f2, options);
    }
} else {
    Files.copy(f1, f2, options);
}

这依赖于Java SE 7。

以下是Java站点中复制文件的示例:

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java

你还应该看看:

http://docs.oracle.com/javase/7/docs/api/java/io/File.html

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

相关内容

  • 没有找到相关文章

最新更新