我在不同的网络驱动器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