java实现的类似windows操作系统的xCopy

package com.iwindyforest.dir;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class FileSystem
{
  private ArrayList<String> fileList = new ArrayList<String>();

  public FileSystem(String path)
  {
    long a = System.currentTimeMillis();
    this.listFiles(path);
    this.print("TimeCost:" + (System.currentTimeMillis() - a) + " Millis");

    this.xCopy(path, "C: \\temp");
  }

  private void print(String message)
  {
    System.out.println(message);
  }

  public void listFiles(String strPath)
  {
    File dir = new File(strPath);
    if(dir != null && dir.exists())
    {
      if(dir.isDirectory())
      {
        File[] files;

        try
        {
          files = dir.listFiles();
        }
        catch(SecurityException e)
        {
          files = null;
          e.printStackTrace();
        }

        if(files == null)
        {
          return;
        }
        else
        {
          for(int i = 0; i < files.length; i++)
          {
            String strFileName = files[i].getAbsolutePath();
            if(files[i].isDirectory())
            {
              this.print("D--:" + strFileName);
              this.listFiles(files[i].getAbsolutePath());
            }
            else
            {
              this.print("F--:" + strFileName);
              fileList.add(files[i].getAbsolutePath());
            }
          }
        }
      }
      else
      {
        this.print("F--:" + dir.getAbsolutePath());
      }
    }
    else
    {
      this.print("FileNotExist:" + dir.getAbsolutePath());
    }
  }

  private boolean checkDir(File dir)
  {

    if(dir == null)
    {
      this.print("dirPath is null");
      return false;
    }
    else if(!dir.exists())
    {
      this.print("dirPath: " + dir.getAbsolutePath() + " doesn't exist.");
      return false;
    }
    else if(!dir.isDirectory())
    {
      this.print("dirPath: " + dir.getAbsolutePath()
          + " is not a directory.");
      return false;
    }
    else
    {
      return true;
    }
  }

  /**
   * 类似与windows操作系统的xCopy,递归拷贝整个源目录到目标目录。源目录和目标目录必须已经存在。
   *
   * @param srcDirPath
   * @param destDirPath
   */
  public void xCopy(String srcDirPath, String destDirPath)
  {
    File srcDir = new File(srcDirPath);
    File destDir = new File(destDirPath);
    if(this.checkDir(srcDir) && this.checkDir(destDir))
    {
      File[] files;

      try
      {
        files = srcDir.listFiles();
      }
      catch(SecurityException e)
      {
        files = null;
        this.print("xCopy breaked: can't listFiles,may be caused by:");
        e.printStackTrace();
        return;
      }

      if(files == null)
      {
        return;
      }
      else
      {
        for(int i = 0; i < files.length; i++)
        {
          String fileName = files[i].getName();
          String absoluteFileName = files[i].getAbsolutePath();

          if(files[i].isDirectory())
          {
            // 下一次递归的源目录
              String subSrcDir = srcDir.getPath() + File.separator
                + fileName;

            // 下一次递归的目的目录
              String subDestDir = destDir.getPath() + File.separator
                + fileName;

            try
            {
              new File(subDestDir).mkdir();
            }
            catch(SecurityException e)
            {
              this.print("can't mkdir in path : " + subDestDir);
              this.print("xCopy breaked cause by: ");
              e.printStackTrace();
              return;
            }

            xCopy(subSrcDir, subDestDir);
          }
          else
          {

            String destFileName = destDirPath + File.separator
                + fileName;
            copyFile(absoluteFileName, destFileName);
          }
        }
      }
    }
  }

  /**
   * 简单复制单个文件到目标路径。目标路径下的该文件必须有可写权限
   *
   * @param srcFilePath
   * @param desFilePath
   */
  public void copyFile(String srcFilePath, String desFilePath)
  {
    int byteread = 0;
    InputStream in = null;
    FileOutputStream out = null;

    try
    {
      in = new FileInputStream(srcFilePath);
      out = new FileOutputStream(desFilePath);
    }
    catch(FileNotFoundException e)
    {
      e.printStackTrace();
    }

    byte[] buffer = new byte[1024];

    try
    {
      while((byteread = in.read(buffer)) != -1)
      {
        out.write(buffer, 0, byteread);
      }

      in.close();
      out.close();
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    if(args.length == 1)
    {
      new FileSystem(args[0]);
    }
    else
    {
      new FileSystem(System.getProperty("user.dir", "c:\\"));
    }
  }
}

时间: 2025-01-03 07:51:08

java实现的类似windows操作系统的xCopy的相关文章

将Java加密技术同Windows结合起来

公共钥匙加密技术需要一个空间来存储数字证书和私钥.通过将钥匙和证书存储到一个文件中(称为keystore),Java Security Architecture实现了独立于平台的加密技术. Microsoft Windows把钥匙和证书存储到Windows注册表和文件系统中.这就是说,在Windows系统上运行安全的Java程序的用户必须在Java和Microsoft的钥匙和证书库之间输入和输出钥匙和证书.好消息是,你可以"哄骗"Java应用程序通过Microsoft本地函数来运用Mi

Windows操作系统的安全模式

对于Windows操作系统的安全模式,经常使用电脑的朋友肯定不会感到陌生,安全模式是Windows用于修复操作系统错误的专用模式,是一种不加载任何驱动的最小系统环境,用安全模式启动电脑,可以方便用户排除问题,修复错误.     进入安全模式的方法是:启动计算机,在系统进入Windows启动画面前,按下F8键(或者在启动计算机时按住Ctrl键不放),在出现的启动选项菜单中,选择"SafeMode",即可     以安全模式启动计算机.那么安全模式到底有哪些用途呢?下面就让我们具体来看一下

windows安全验证-java实现登录带有windows安全登录的网页

问题描述 java实现登录带有windows安全登录的网页 各位大神,请教一下,登录http://x.x.x.x时,网页弹出上图的窗口,怎么使用java登录带有上述提示信息的网页. 解决方案 这个问题解决了,方法来自stack overflow,通过java向http发送请求时,需要把用户名和密码进行编码操作,这样服务器才能识别.编码的代码如下,还需要导入一个编码包(sun.misc.BASE64Decoder.jar). BASE64Encoder encoder = new BASE64En

在做一个游戏,想问java有没有类似图层功能

问题描述 在做一个游戏,想问java有没有类似图层功能 目前已知情报 1.好像有个叫JlayerdPane的 2.我的目标是顶层游戏主体用panel话,中层添加视频,底层添加图片 3.问题有两个: 一是用media只能放在frame上面?我想加在panel上,否则添加panel的时候就被覆盖掉了 二是把panel设置成背景透明的,通过 panel.setBackground(null); // 把背景设置为会 panel.setOpaque(false); // 设置为透明 不知道在一的条件下能

C中,(int)-0.5=-1,java中,(int)-0.5=0;java有没有类似算法

问题描述 C中,(int)-0.5=-1,java中,(int)-0.5=0;java有没有类似算法 C的这种方法的浮点整数映射上是线性的,java的方法在0附近将发生重叠,这样的话,在实数域处理问题要分类讨论,不方便. 方法好像有Math.floor(),不知道还有没有简单的表达式 解决方案 (int)-0.5=-1 这个才是科学的,因为int永远是找比自身小的最大整数. java需要判断 double d = -0.5; int r = d > 0? (int)d : (int)d - 1;

静态代码检查-c++有没有和JAVA的gradle类似的自动化构建工具?

问题描述 c++有没有和JAVA的gradle类似的自动化构建工具? c++有没有和JAVA的gradle类似的自动化构建工具?并且检查效率比较高,速度比较快 解决方案 cmake可以.还有像scons之类的

jcom-利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?

问题描述 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统? 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?我发现在32位机器上是可以调用成功的,为什么切换到64为机器上就调用不成功,有谁了解这个Jcom的,谢谢给个解答.

java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源

问题描述 java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源 目前很多浏览器都有这样的功能,在地址栏中输入连接后中可以通过httpwatch,清楚的看到此连接已经请求了多少资源(图片,css,js)等等.想问问高手,如何利用java实现,或者说java有没有这种开源的工具. 想实现的功能如图,我在地址栏中输入www.hao123.com后,可以看到它向服务器进行了很多资源的请求.我想知道的如何通过java来获取这些请求资源.

java wrapper 如何与windows应用交互

问题描述 java wrapper 如何与windows应用交互 java wrapper 如何与windows应用交互,或调用外部程序 解决方案 一样的,可以用jni调用外部dll Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("你的exe.exe"); 执行程序. 但是要注意几个问题: (1)在服务账户里运行程序,如果程序是有界面的,界面显示不了,因为它在服务账户执行,而不是你桌面登录的