精华内容
下载资源
问答
  • 最近有一个需求,需要获得一个GitHub项目的不同commit版本,如果每次都从GitHub上拉取代码的话,不仅耗时(没有翻墙的朋友来,比如我/(ㄒoㄒ)/~~),而且不好确定具体的commit版本。 于是想根据已经下载下来的...

    目录

    一,问题描述

    1,相关代码如下:

    2,复制后的区别如下: 

    二,解决方法

    1,相关代码如下:

    2,运行效果如下:


    一,问题描述

    最近有一个需求,需要获得一个GitHub项目的不同commit版本,如果每次都从GitHub上拉取代码的话,不仅耗时(对没有翻墙的朋友来说,比如我/(ㄒoㄒ)/~~),而且不好确定具体的commit版本。

    于是想根据已经下载下来的一个commit版本,将其复制到不同的文件夹中(直接复制肯定要比从网站上拉取要快,尤其是大型项目),在各自的文件夹中执行git reset --hard HEAD~n来回滚到指定的版本。

    然而在用Java信心满满的编写好代码后,发现复制过来的文件夹中不能执行git命令(主要通过refreshWorkspace方法来调用文件复制、文件删除等函数)

    1,相关代码如下:

    import java.io.*;
    
    public class GitUtil {
    
        public static long runRollBackGitShell(String projectPath, int num) {
            try {
                long startTime =  System.currentTimeMillis();
                long endTime, usedTime;
                System.out.println("开始执行命令:git reset --hard HEAD~" + num);// 注意这里必须是HEAD~1而不是HEAD^
                String comm = "cmd.exe /c cd " + projectPath + "&& git reset --hard HEAD~" + num;
                Process proc = Runtime.getRuntime().exec(comm);
    
                int processCode = proc.waitFor();
                if(processCode == 0) {
                    System.out.println("命令执行完成");
                    endTime =  System.currentTimeMillis();
                    // 获取扫描时间
                    usedTime = (endTime - startTime) / 1000;
                    System.out.println("更新commit数据用时" + usedTime + "s");
                    System.out.println("-----------------------------");
                    return usedTime;
                } else {
                    System.out.println("执行失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return -1;
        }
    
        public static String runDiffGitShell(String projectPath) {
            Runtime run = Runtime.getRuntime();
            try {
                Process process = run.exec("cmd.exe /c cd " + projectPath + "&& git diff HEAD~1");
                InputStream in = process.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                BufferedReader br = new BufferedReader(reader);
                StringBuffer sb = new StringBuffer();
                String message;
                while((message = br.readLine()) != null) {
                    sb.append(message + "\n");
                }
                System.out.println(sb);
                return sb.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    
        //复制文件夹
        public static void copyFolder(File srcFolder, File desFolder) throws IOException {
            //遍历原始文件夹里面的所有文件及文件夹
            File[] files = srcFolder.listFiles();
            for (File srcFile : files) {
                //如果是文件夹
                if (srcFile.isDirectory()){
                    //在新的文件夹内创建一个和srcFile文件夹同名文件夹,然后再递归调用,判断文件夹里面的情况,然后做出相应处理
                    String srcFileName = srcFile.getName();
                    File newFolder = new File(desFolder, srcFileName);
                    if (!newFolder.exists()){
                        newFolder.mkdir();
                        copyFolder(srcFile,newFolder);
                    }
                    //如果是文件
                }else {
                    String srcFileName = srcFile.getName();
                    File desFile = new File(desFolder, srcFileName);
                    copyFile(srcFile,desFile);
                }
    
            }
        }
    
        //复制文件
        public static void copyFile (File srcFile, File desFile) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile),"utf-8"));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(desFile),"utf-8"));
    
            String temp = null;
            while((temp = br.readLine())!=null){
                bw.write(temp + "\n");
                bw.flush();
            }
            br.close();
            bw.close();
        }
    
        public static void deleteFile(File file) {
            //判断文件不为null或文件目录存在
            if (file == null || !file.exists()){
                return;
            }
            //取得这个目录下的所有子文件对象
            File[] files = file.listFiles();
            //遍历该目录下的文件对象
            for (File f: files){
                //打印文件名
                String name = file.getName();
                //判断子目录是否存在子目录,如果是文件则删除
                if (f.isDirectory()){
                    deleteFile(f);
                }else {
                    f.delete();
                }
            }
            //删除空文件夹  for循环已经把上一层节点的目录清空。
            file.delete();
        }
    
        public static void refreshWorkspace(String path, String projectFileName) {
            try {
                File f = new File(path + "\\" + projectFileName + "-workspace");
                deleteFile(f);// 删除该目录下所有文件夹和文件
                f = new File(path + "\\" + projectFileName + "-workspace");
                f.mkdir();// 重新创建目录
                File desFolder = new File(path + "\\" + projectFileName + "-workspace" + "\\" + projectFileName);
                File srcFolder = new File(path + "\\" + projectFileName);
                if(desFolder.mkdir()) {
                    copyFolder(srcFolder, desFolder);
                } else {
                    System.out.println("Error");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    2,复制后的区别如下: 

    因此无法正常进行下一步的工作。

     

    二,解决方法

    从上面的截图可以看出,使用Java复制文件虽然可行,但是会改变某些隐藏文件的属性格式,导致原有命令执行失败(暂时没找到通过Java字节流复制文件的解决方法)

    因此想通过执行cmd命令完成文件夹的复制工作(Windows中用cmd,Linux可进行相应的修改)。参考文章@dream_uping【cmd命令 复制文件夹里所有文件到另一个文件夹操作方式】

    xcopy 源文件夹 目的文件夹 参数

    xcopy D:\TestProjects\untitled D:\TestProjects\untitled-workspace /s /f /h

    XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件;

    • /S 复制目录和子目录,除了空的。
    • /F 复制时显示完整的源和目标文件名。
    • /H 也复制隐藏和系统文件。

    1,相关代码如下:

    GitUtil

    import java.io.*;
    
    public class GitUtil {
    
        public static void copyFolderByCMD(String scrFolder, String desFolder) {
            Runtime run = Runtime.getRuntime();
            try {
                Process process = run.exec("cmd.exe /c " + "xcopy " + scrFolder + " " + desFolder + " /s /f /h");
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static void deleteFile(File file) {
            //判断文件不为null或文件目录存在
            if (file == null || !file.exists()){
                return;
            }
            //取得这个目录下的所有子文件对象
            File[] files = file.listFiles();
            //遍历该目录下的文件对象
            for (File f: files){
                //打印文件名
                String name = file.getName();
                //判断子目录是否存在子目录,如果是文件则删除
                if (f.isDirectory()){
                    deleteFile(f);
                }else {
                    f.delete();
                }
            }
            //删除空文件夹  for循环已经把上一层节点的目录清空。
            file.delete();
        }
    
        public static void refreshWorkspaceByCMD(String path, String projectFileName) {
            try {
                File f = new File(path + "\\" + projectFileName + "-workspace");
                deleteFile(f);// 删除该目录下所有文件夹和文件
                f = new File(path + "\\" + projectFileName + "-workspace");
                // 在项目所在目录下创建"项目名-workspace"文件夹
                f.mkdir();
                f = new File(path + "\\" + projectFileName + "-workspace" + "\\" + projectFileName);
                // 在"项目名-workspace"文件夹中创建与项目同名的文件夹
                if(f.mkdir()) {
                    String srcFolder = path + "\\" + projectFileName;
                    String desFolder = path + "\\" + projectFileName + "-workspace" + "\\" + projectFileName;
                    copyFolderByCMD(srcFolder, desFolder);
                } else {
                    System.out.println("Error");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    Main

    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URLEncoder;
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            String path = "D:\\TestProjects";
            String projectFileName = "untitled";
    
            GitUtil.refreshWorkspaceByCMD(path, projectFileName);
        }
    }
    
    

    2,运行效果如下:

     

     

    展开全文
  • 一、基本目标使用Java完成如下的操作:把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中a与b两个文件夹:f:/a里面一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加...

    一、基本目标

    使用Java完成如下的操作:

    把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹:

    044c2ee8f6581aa2843bd7dd109ad859.png

    f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀:

    2d47e80f1cb0530d8a524c888c537f2e.gif

    二、制作过程

    1、首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数

    public class FileCopy {

    public static void main(String args[]) {

    new FileTest().copyFolder("f:/a", "f:/b");

    }

    }

    值得注意的是,这个的传递过去的参数的路径写法,在java中,f:/a是没有问题的,f:\a也是没有问题的,但是由于\在字符串表达的时候,必须转移,所以你必须写成f:\\a

    2、整个程序的关键在这个FileTest类中的copyFolder函数,这个类里面就这个函数-_-!而且注意在程序开头引入java.io.*;由于用到了输入输出流

    class FileTest {

    public void copyFolder(String oldPath, String newPath) {

    try {

    // 如果文件夹不存在,则建立新文件夹

    (new File(newPath)).mkdirs();

    //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组

    File filelist = new File(oldPath);

    String[] file = filelist.list();

    //要注意,这个temp仅仅是一个临时文件指针

    //整个程序并没有创建临时文件

    File temp = null;

    for (int i = 0; i < file.length; i++) {

    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了

    //否则要自己oldPath后面补个路径分隔符再加文件名

    //谁知道你传递过来的参数是f:/a还是f:/a/啊?

    if (oldPath.endsWith(File.separator)) {

    temp = new File(oldPath + file[i]);

    } else {

    temp = new File(oldPath + File.separator + file[i]);

    }

    //如果游标遇到文件

    if (temp.isFile()) {

    FileInputStream input = new FileInputStream(temp);

    FileOutputStream output = new FileOutputStream(newPath

    + "/" + "rename_" + (temp.getName()).toString());

    byte[] bufferarray = new byte[1024 * 64];

    int prereadlength;

    while ((prereadlength = input.read(bufferarray)) != -1) {

    output.write(bufferarray, 0, prereadlength);

    }

    output.flush();

    output.close();

    input.close();

    }

    //如果游标遇到文件夹

    if (temp.isDirectory()) {

    copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);

    }

    }

    } catch (Exception e) {

    System.out.println("复制整个文件夹内容操作出错");

    }

    }

    }

    可能游标遇到文件部分有点难以理解,其实是这样的,首先设置一个文件的输入流,指定从游标遇到的文件中输入,再指定输出到newPath/rename_旧文件的文件名这个文件目录,之后,设置一个缓冲数组,文件输入流对于自己要读取的文件,每次调用read方法,它都会向后继续上一次读取的位置继续读取缓冲数组bufferarray的长度的内容,把读取到的内容存储到缓冲数组,覆盖缓冲数组之前的所有内容,然后文件输出流会把缓冲数组的所有内容输出的指定的位置,直到文件输入流遇到了-1。

    至于文件输入流为何能这样按顺序,每次都会向后继续上一次读取的位置继续读取,那是因为当要进行文件的读取,Java封装的FileInputStream.read方法也会调用操作系统的API依次读取这些数据。在读取文件数据的时候必须是顺序的,不可能说先读取第一个字节,后读取倒数第二个字节。循环读取的时候就read方法将读取的位置++,因此造成每次read都是顺序读取后面的字节,直到遇到文件末尾标记。

    当游标遇到文件夹则重新调用自己完成同样的操作即可,这就是所谓的迭代。

    3、因此整个程序如下:

    import java.io.*;

    /**

    *

    * @param oldPath 被拷贝的目录

    * @param newPath 要拷贝到的目录

    *

    */

    class FileTest {

    public void copyFolder(String oldPath, String newPath) {

    try {

    // 如果文件夹不存在,则建立新文件夹

    (new File(newPath)).mkdirs();

    //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组

    File filelist = new File(oldPath);

    String[] file = filelist.list();

    //要注意,这个temp仅仅是一个临时文件指针

    //整个程序并没有创建临时文件

    File temp = null;

    for (int i = 0; i < file.length; i++) {

    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了

    //否则要自己oldPath后面补个路径分隔符再加文件名

    //谁知道你传递过来的参数是f:/a还是f:/a/啊?

    if (oldPath.endsWith(File.separator)) {

    temp = new File(oldPath + file[i]);

    } else {

    temp = new File(oldPath + File.separator + file[i]);

    }

    //如果游标遇到文件

    if (temp.isFile()) {

    FileInputStream input = new FileInputStream(temp);

    FileOutputStream output = new FileOutputStream(newPath

    + "/" + "rename_" + (temp.getName()).toString());

    byte[] bufferarray = new byte[1024 * 64];

    int prereadlength;

    while ((prereadlength = input.read(bufferarray)) != -1) {

    output.write(bufferarray, 0, prereadlength);

    }

    output.flush();

    output.close();

    input.close();

    }

    //如果游标遇到文件夹

    if (temp.isDirectory()) {

    copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);

    }

    }

    } catch (Exception e) {

    System.out.println("复制整个文件夹内容操作出错");

    }

    }

    }

    public class FileCopy {

    public static void main(String args[]) {

    new FileTest().copyFolder("f:/a", "f:/b");

    }

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 一个就是大家非常熟悉的 “我的文档”。由于“我的文档”保存在用户配置文件内,如如果采用漫游用户配置文件管理策略的话 ,则通过“我的文档”来管理用户的私有文件可能会影响操作系统的性能。因为如果用户采用存储...

    匿名用户

    1级

    2019-02-14 回答

    在Windows系统中通过主文件夹管理私有文件

    在微软操作系统中,默认情况下有两个地方可以用来存储用户的私有文件。一个就是大家非常熟悉的 “我的文档”。由于“我的文档”保存在用户配置文件内,如如果采用漫游用户配置文件管理策略的话 ,则通过“我的文档”来管理用户的私有文件可能会影响操作系统的性能。因为如果用户采用存储在服 务器端的漫游用户配置文件,则在登陆的时候系统需要花一定的时间去服务器上下载“我的文档”中的 内容。同时在系统注销时,也需要花费一定的时间将数据保存到服务器中。故这一来一回就对操作系统 开机、关机的速度产生了影响。

    除了“我的文档”外,微软操作系统还可以通过“主文件夹”来管理用户的私有文件。笔者在日常工 作中,喜欢让企业员工利用“主文件夹”,而不是“我的文档”来管理他们的文件。因为主文件夹在安 全性上有一定的保障。通常情况下,主文件夹只有该用户与系统管理员用户(Administrator)才有权访问 这个文件夹,这跟Linux操作系统的/home目录下的用户文件夹非常的相像。而且主文件夹不包含在用户 配置文件内,故即使系统管理员采用了漫游用户配置文件也不会对操作系统产生不利的影响。

    一、主文件夹的存储位置

    主文件夹既可以设置为用户自己的计算机内,也可以保存在网络上的某台计算机的共享文件夹之中( 如下图所示)。而且无论企业是否启用了域环境,都可以采用主文件夹来管理用户的私有文件。这跟漫游 用户配置文件不同。漫游用户配置文件的话,必须在域环境中才能够实现,而主文件夹的话就没有这个 限制。域用户与本地用户都可以制定主文件夹。

    如上图所示,现在有一个域用户SA01。其可以把自己的主文件夹存放在网络中一台服务器上。如此的 话,其即使使用其他电脑的话,也可以访问这个主文件夹中的信息。简单的说,这个主文件夹功能就是 一个简易的文件服务器。只是这个文件服务器不能够实现员工之间的文件共享。只有用户自己和系统管 理员才能够访问这些文件。

    二、主文件夹的配置要点。

    下面笔者就以上图为例,谈谈主文件夹的具体配置过程以及配置过程中的要点。

    第一步:在服务器上创建共享文件夹。首先系统管理员要以域系统管理员身份的用户帐务进行登陆。 否则的话,后续的工作将无法顺利完成。系统管理员事先要在服务器上建立一个共享文件夹。为了便于 管理,最好在下面再建立一个子文件夹,并以用户的名字(如SA01)命令。建立完成之后,还必须修改这 个共享文件夹的权限。如让域系统管理员对该共享文件夹具有“更改”的共享权限。注意这里不用为用 户SA01设置相关权限。后续的配置中系统自动会为用户SA01赋予其必须的权限。这里只要保证域系统管 理员具有相关的修改权限既可。

    第二步:依次打开“开始”、“管理工具”、“活动目录用户和计算机”,找到用户SA01所在的组织 单位或容器,双击用户帐户。再打开的窗口中选择“配置文件”。在打开的页签中,通过“连接到”功 能将其主文件的位置设置到\\服务器IP地址\共享文件名\用户文件夹内。然后操作系统会自动创建以这 个用户名命名的子文件夹,系统管理员不需要预先建立文件夹。在建立文件夹的同时,只要该文件夹位 于NTFS磁盘分区内,则系统会赋予用户这个文件夹的修改权限。虽然系统对这个文件夹的命名没有强制 的规定,不过为了管理的方便,最好能够以用户的名字命名。当系统自动创建文件夹时,如果以这个用 户命名的文件夹已经存在,则系统会提示“主文件夹已经存在,是否要覆盖”类似的错误信息。此时系 统管理员可以选择是按钮,系统就会自动设置让用户有权访问这个文件夹。

    经过以上两个步骤之后,主文件夹就配置完成了。以后用户SA01保存文件时默认情况下就会保存在这 个主文件夹之内。而且只有用户与系统管理员才可以看到访问这个文件夹中的内容。

    三、主文件夹的管理难点。

    虽然主文件夹的设置比较简单,只需要简单的两个步骤就可以完成。但是有一些基本的原则系统管理 员必须了解,并且要能够排除一些基本的错误。不然的话,在后续的管理中,系统管理员就有的苦头吃 了。

    注意点一:笔者建议系统管理员最好不要将域用户的主文件夹设置到本地的计算机之内。因为此时系 统不会自动创建用户文件夹(域用户只有把主文件夹设置到网络中的服务器上才会自动创建用户文件夹) ,也不会设置其权限。也就是说,如果系统管理员要将域用户的主文件夹设置到本地的话,系统管理员 必须预先建立用户文件夹,并手工为这个域用户设置赋予其必须的权限,否则的话主文件夹将不能够其 作用。最重要的是,如果将域用户的主文件夹设置在本地,则域用户无论到哪一台计算机登录时,该计 算机内必须存在这个主文件夹,否则的话将会出现错误。而且即使存在这文件夹,其内容也不能够实现 同步。出于以上这几个方面的考虑,笔者建议系统管理员最好不要将域用户的主文件夹设置在本地的计 算机之中。

    注意点二:笔者建议最好不要将本地用户的主文件夹设置到网络某台服务器上的共享文件夹内。这跟 上面的情形类似。如果这个用户是本地计算机用户,则即使把这个主文件夹设置在网络的服务器上,系 统也不会自动创建这个文件夹;也无法自动设置用户的访问权限。如果系统管理员一定要这么做的话,则 必须先手工在服务器上建立用户的文件夹,并赋予相关的权限。否则的话,这个主文件夹的配置就不会 成功。这主要是因为用户为本地用户,无法直接在服务器上设置文件夹并配置用户权限的权利。为了管 理的方便,笔者建议最好将本地用户的主文件夹建立在本地上。如果出于安全方面的考虑,可以采用其 他备份机制将本地主文件夹中的内容定时备份到服务器上。

    注意点三:如果系统管理员采用的是域用户,并且在将主文件夹设置在共享服务器上,则此时就可以 实现对文件的统一备份。即系统管理员要定时的对这台服务器上的共享文件夹进行备份。如此的话,可 以保障共享文件夹中文件的安全。如当主文件夹中的文件被意外损坏(如用户意外删除或者修改)等原因 ,也可以通过备份文件还原,从而降低文件丢失或被意外修改造成的损失。

    注意点四:在网络服务器中建立共享文件夹时,一定要注意一个问题,即需要给域系统管理员赋予修 改的权限。如果在配置主文件夹的时候,出现这个“路径找不到,没有创建主文件夹”等类似的错误提 示,那么很有可能是由于域系统管理员没有这个共享文件夹的修改权限造成的。系统管理员在日常工作 中,要收集造成这些错误的原因。如此的话,以后再遇到类似的错误信息的话,则系统管理员可以迅速 的排错,缩短主文件夹当机的时间。

    追问:

    谢谢你给的答案 主机不是域控制器。两个用户同时远程登陆到了win2003上,同时在win2003 D盘上建立了两个文件夹可是都能打开对方的文件。我只是想各自只能打开各自的文件夹而不被对方打开或者不要让对方看到自己建立的文件夹。怎么解决啊

    追答:

    win2003

    我们可以通过“控制面板”--“管理工具”--“计算机管理”--“用户和用户组”来查看用户组及该组下的用户。

    我们用鼠标右键单击一个NTFS卷或NTFS卷下的一个目录,选择“属性”--“安全”就可以对一个卷,或者一个卷下面的目录进行权限设置,此时我们会看到以下七种权限:完全控制、修改、读取和运行、列出文件夹目录、读取、写入、和特别的权限。“完全控制”就是对此卷或目录拥有不受限制的完全访问。地位就像Administrators在所有组中的地位一样。选中了“完全控制”,下面的五项属性将被自动被选中。

    你分别设置A和B用户属于不同的用户组,并设置D盘上不同文件夹的访问读写权限即可,比如A属于Users:普通用户组用户,另一个B属于Guests:来宾组用户,

    Users:普通用户组,这个组的用户无法进行有意或无意的改动。因此,用户可以运行经过验证的应用程序,但不可以运行大多数旧版应用程序。Users 组是最安全的组,因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料。Users 组提供了一个最安全的程序运行环境。在经过 NTFS 格式化的卷上,默认安全设置旨在禁止该组的成员危及操作系统和已安装程序的完整性。用户不能修改系统注册表设置、操作系统文件或程序文件。Users 可以关闭工作站,但不能关闭服务器。Users 可以创建本地组,但只能修改自己创建的本地组。

    Guests:来宾组,按默认值,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多。

    在windows 2003服务器对各自的文件夹设置权限即可。为了以后访问方便,对文件夹设置隐藏共享,用户的电脑上添加映射该隐藏共享文件夹为一个网络盘,每次开机自动显示出各自的那个文件夹,而不会看到别的用户的。

    或者,你使用文件夹加密超级大师给不同的文件夹加密并设置不同的密码,别分别告知A和B加密密码.只有输入正确的密码才可以打开该文件夹,

    展开全文
  • 本文主要向大家介绍了Java语言利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹,通过具体的内容向大家展示,希望大家学习JAVA语言有所帮助。一、基本目标使用Java完成如下的操作:把一个文件夹内的所有...

    本文主要向大家介绍了Java语言利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

    一、基本目标

    使用Java完成如下的操作:

    把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹:

    f:/a里面有一堆文件,运行java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀:

    二、制作过程

    1、首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数

    public class FileCopy {

    public static void main(String args[]) {

    new FileTest().copyFolder("f:/a", "f:/b");

    }

    }

    复制代码

    值得注意的是,这个的传递过去的参数的路径写法,在java中,f:/a是没有问题的,f:\a也是没有问题的,但是由于\在字符串表达的时候,必须转移,所以你必须写成f:\\a

    2、整个程序的关键在这个FileTest类中的copyFolder函数,这个类里面就这个函数-_-!而且注意在程序开头引入java.io.*;由于用到了输入输出流

    class FileTest {

    public void copyFolder(String oldPath, String newPath) {

    try {

    // 如果文件夹不存在,则建立新文件夹

    (new File(newPath)).mkdirs();

    //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组

    File filelist = new File(oldPath);

    String[] file = filelist.list();

    //要注意,这个temp仅仅是一个临时文件指针

    //整个程序并没有创建临时文件

    File temp = null;

    for (int i = 0; i < file.length; i++) {

    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了

    //否则要自己oldPath后面补个路径分隔符再加文件名

    //谁知道你传递过来的参数是f:/a还是f:/a/啊?

    if (oldPath.endsWith(File.separator)) {

    temp = new File(oldPath + file[i]);

    } else {

    temp = new File(oldPath + File.separator + file[i]);

    }

    //如果游标遇到文件

    if (temp.isFile()) {

    FileInputStream input = new FileInputStream(temp);

    FileOutputStream output = new FileOutputStream(newPath

    + "/" + "rename_" + (temp.getName()).toString());

    byte[] bufferarray = new byte[1024 * 64];

    int prereadlength;

    while ((prereadlength = input.read(bufferarray)) != -1) {

    output.write(bufferarray, 0, prereadlength);

    }

    output.flush();

    output.close();

    input.close();

    }

    //如果游标遇到文件夹

    if (temp.isDirectory()) {

    copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);

    }

    }

    } catch (Exception e) {

    System.out.println("复制整个文件夹内容操作出错");

    }

    }

    }

    复制代码

    可能游标遇到文件部分有点难以理解,其实是这样的,首先设置一个文件的输入流,指定从游标遇到的文件中输入,再指定输出到newPath/rename_旧文件的文件名这个文件目录,之后,设置一个缓冲数组,文件输入流对于自己要读取的文件,每次调用read方法,它都会向后继续上一次读取的位置继续读取缓冲数组bufferarray的长度的内容,把读取到的内容存储到缓冲数组,覆盖缓冲数组之前的所有内容,然后文件输出流会把缓冲数组的所有内容输出的指定的位置,直到文件输入流遇到了-1。

    至于文件输入流为何能这样按顺序,每次都会向后继续上一次读取的位置继续读取,那是因为当要进行文件的读取,Java封装的FileInputStream.read方法也会调用操作系统的API依次读取这些数据。在读取文件数据的时候必须是顺序的,不可能说先读取第一个字节,后读取倒数第二个字节。循环读取的时候就read方法将读取的位置++,因此造成每次read都是顺序读取后面的字节,直到遇到文件末尾标记。

    当游标遇到文件夹则重新调用自己完成同样的操作即可,这就是所谓的迭代。

    3、因此整个程序如下:

    import java.io.*;

    /**

    *

    * @param oldPath 被拷贝的目录

    * @param newPath 要拷贝到的目录

    *

    */

    class FileTest {

    public void copyFolder(String oldPath, String newPath) {

    try {

    // 如果文件夹不存在,则建立新文件夹

    (new File(newPath)).mkdirs();

    //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组

    File filelist = new File(oldPath);

    String[] file = filelist.list();

    //要注意,这个temp仅仅是一个临时文件指针

    //整个程序并没有创建临时文件

    File temp = null;

    for (int i = 0; i < file.length; i++) {

    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了

    //否则要自己oldPath后面补个路径分隔符再加文件名

    //谁知道你传递过来的参数是f:/a还是f:/a/啊?

    if (oldPath.endsWith(File.separator)) {

    temp = new File(oldPath + file[i]);

    } else {

    temp = new File(oldPath + File.separator + file[i]);

    }

    //如果游标遇到文件

    if (temp.isFile()) {

    FileInputStream input = new FileInputStream(temp);

    FileOutputStream output = new FileOutputStream(newPath

    + "/" + "rename_" + (temp.getName()).toString());

    byte[] bufferarray = new byte[1024 * 64];

    int prereadlength;

    while ((prereadlength = input.read(bufferarray)) != -1) {

    output.write(bufferarray, 0, prereadlength);

    }

    output.flush();

    output.close();

    input.close();

    }

    //如果游标遇到文件夹

    if (temp.isDirectory()) {

    copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);

    }

    }

    } catch (Exception e) {

    System.out.println("复制整个文件夹内容操作出错");

    }

    }

    }

    public class FileCopy {

    public static void main(String args[]) {

    new FileTest().copyFolder("f:/a", "f:/b");

    }

    }

    希望对JAVA有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言JAVA频道!

    展开全文
  • 本文实例讲述了Python实现合并同一个文件夹下所有PDF文件的方法。分享给大家供大家参考,具体如下:一、需求说明下载了网易云课堂的吴恩达免费的深度学习的pdf文档,但是每一节是一个pdf,我把这些PDF文档放在一个...
  • 1. 专用 JRE安装 JDK 时,会安装一个专用 JRE,并且您可以选择安装一个公共副本。需要专用 JRE 才能运行 JDK 中包含的工具。专用 JRE 没有注册表设置,并且完全包含在仅 JDK 已知的 Java 目录位置,通常位于D:\...
  • 如果需要复制一个文件到多个文件夹下,可以使用多条cp语句,或者使用shell脚本。用法示例:复制abc.txt到ab cd ef目录下$ cp abc.txt ab$ cp abc.txt cd$ cp abc.txt ef脚本方式:复制abc.txt到ab cd ef目录下dirs=...
  • (1)首先,必须保证java的所有路径都设置好,在dos提示符下输入jar -help出现C:\Documents and Settings\dly>jar -help非法选项:h用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...选项...
  • 在Java中,文件或文件夹进行重命名是很简单的,因为Java的File类已经封装好renameTo的方法。修改文件或者文件夹的名字都使用这方法。例如如下的程序:importjava.io.*;publicclassrenameTest{...
  • 指定的目录名不能是当前目录中已的目录。命令实例0. 帮助文件bixiaopeng@bixiaopengtekiMacBook-Pro testshell$mkdir --help用法:mkdir [选项]... 目录...若指定目录不存在则创建目录。长选项必须使用的参数对于...
  • 在linux中怎样用命令完全拷贝一个目录下的所有文件(包括隐藏文件以及文件夹)到另外一个目录下,并且使得被复制的所有文件的属性等完全保持不变?注意,连原来的文件夹中所有的文件的属性、链接等都不能更改。也就是...
  • ftp服务器对文件夹设置权限 内容精选换换将对象权限设置为匿名用户读取权限,通过分享对象URL,匿名用户通过分享的链接地址可访问对象数据。已经设置匿名用户该对象的读取权限。权限开启方法请参见匿名用户...
  • 我有一个web目录/www和一个名为store的文件夹。在store中几个文件和文件夹。我想授予文件夹store和store文件夹中的所有文件和文件夹所有权限。我该怎么做?我猜是通过.htaccess。您需要认真考虑为/www目录下的所有...
  • -------------精选文档-----------------创建文件夹【mkdir】、 mkdir命令使用权限所有用户都可以在终端使用mkdir命令在拥有权限的文件夹创建文件夹或目录。二、 mkdir命令使用格式格式mkdir [选项]DirName三、 ...
  • 在云服务器上建共享文件夹 内容精选换一换要访问您的文件系统,如果是Linux云服务器,您需要在Linux云服务器上安装NFS客户端后使用挂载命令挂载文件系统;如果是Windows云服务器,您需要在...挂载完成Tomcat是一个被...
  • mv可以把多个文件移动到一个文件夹(目录)里面,比如:a b c三个文件,一个目录d,用下面命令就能将a b c移动到d中$ mv a b c d需要注意的是,目录d必须在最后面,而且它前面不能再出现其他目录2. 也可以使用带...
  • 2013-11-23 回答2008 r2服务器 每部门只能进...第章:共享的前提工作:1.更改不同的计算机名,设置相同的工作组!2.我的电脑右键-管理-计算机管理-本地用户和组-用户:更改管理员用户名3.手动设置ip,将ip...
  • svn服务器创建文件夹

    2021-08-01 07:56:37
    SVN安装配置与使用在本机上创建文件夹SetUp,右键点击SVN Checkout…弹出如下窗体 在上图中URL of Repository:下的文本框输入svn server中代码库的地址,其他默认,点击OK按钮,就开始签出源代码了 说明:上图中...
  • 教学背景:本课是小学信息技术四年级(上)第三章《文件和文件夹的基本操作》,在教学安排上,继前一节学生认识文件和文件夹之后,是学生第次操作使用文件和文件夹。本课中学生的操作对象——文件和文件夹的基本操作...
  • 而大家工作常常都会一些非常重要的文件或者一些东西不愿意别人们所认识,这时候大家就必须这些文件进行更改文件夹类型。那下面我就给大家简单的介绍一下更改文件夹类型的方法以及注意事项。更改文件夹类型...
  • 建立一个项目后,各个文件夹有什么作用以及如何使用等等。理清楚这些东西以后开发是很好处的,古话得好,工欲善其事,必先利其器。本文主要总结android程序的入口点和程序的运行流程(初识),android项目中各...
  • 有一个 Qt 工程叫 QtTest 存储在 百度云同步盘 里面: /Users/Biao/Baidu/百度云同步盘/QtTest因为 Qt 工程 QtTest 的路径中中文字符,所以 QtCreator 是不能编译这个 Qt 工程的。于是我们就想把这个含有中文的路径...
  • linux打开文件夹

    千次阅读 2021-03-10 15:21:56
    在linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 这就是一个文件的路径。如果你告诉系统这个文件的路径,那么系统就可以找到这个文件。在linux的...
  • ftp服务器创建文件夹

    2021-08-10 03:48:30
    ftp服务器创建文件夹 内容精选换换通过Web浏览器登录应用资源,提供协同分享、文件传输、文件管理等功能。用户在应用上执行的所有操作,被云堡垒机记录并生成审计数据。协同分享指会话创建者将当前会话链接发送给...
  • linux svn 添加文件夹

    2021-05-11 07:19:33
    YES $这会在HTML文档中,添加一个侧边栏,并以树状结构显示包、类、接口等的关系 GENERATE TREEVIEW = ALL 程序源码文档化 准备好 Doxygen 的工作环境后,就需要根据 Doxygen 所定义的注释规则,程序源码进行文档...
  • linux压缩文件夹命令

    千次阅读 2021-01-25 15:26:37
    例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 tar -zcvf /home/xahot.tar.gz /xahot zip 压缩方法: 压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归 zip [参数] [打包后的文件名] [打包的...
  • 作为一个码农不能只是懂得ctrl+c、ctrl+v…思维模式很重要,别要一个小时干了自己两天的工作量时,很多人来来恨不得挖个坑把自己给埋了。 特别是对于VUE初学者来,我们在每个组件要用到其他各种组件、js文件都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 371,364
精华内容 148,545
关键字:

对一个文件来说必须有