如何创建包含特定文件副本的目录结构?

时间:2016-09-17 06:55:44

标签: java eclipse templates filesystems package

我正在编写将项目保存在所选目录中所需的程序。每个项目目录必须包含一个HTML文件,该文件可能具有不同的元素,具体取决于项目的状态,以及子目录中的标准JavaScript文件库。

我不熟悉通常用Java完成的方法(甚至不知道如何在理论上完成)。是否有适合此任务的特定工具,技术或库?请注意,我使用Eclipse作为我的IDE。我一直在考虑使用某种模板生成所需的文件,和/或从包中提取它们,但我对这类问题很新,不知道如何从这里开始。

编辑:进一步阐述

我的项目是一个供个人使用的小工具,因此可维护性不会成为一个问题。我使用的是Java 8.在每个用户创建的项目中,库中只有三个不变的.js文件和一个小的html文件,它将在浏览器中启动以运行脚本,以及用户生成的.js文件。非常基本的东西。

编辑:问题解决了......我想

我已经提出了我自己的部分解决方案,我想我可以从这里找出其余部分,但是DB的帖子仍然提供了信息和帮助,所以我接受了它作为答案。

我意识到我原来的问题不够具体。我希望隐藏我的静态脚本资源和HTML文件的模板,以便无法从文件系统直接访问它们。我一直在考虑将它们放在某种类型的包文件中,该文件与应用程序jar位于同一目录中。然而,我想到了我可以简单地将它们放在jar本身的资源文件夹中。

在用户指定的项目目录中创建libraries目录:

libraryDir = projectDir.resolve("libraries");
new File(libraryDir.toUri()).mkdirs(); // Create libraries directory

// Unpack library resources to project
unpackLibrary("file1.js");
unpackLibrary("file2.js");
unpackLibrary("file3.js");

unpackLibrary函数:

private void unpackLibrary(String scriptName) {
    String resourcePath = "/libraries/" + scriptName;

    Path fileName = Paths.get(resourcePath).getFileName();
    try (InputStream in = getClass().getResourceAsStream(resourcePath);) {
        Files.copy(in, libraryDir.resolve(fileName));
    }
    catch (FileAlreadyExistsException e) {
        System.out.println("File unpack failed: File already exists (" + e.getFile() + ")");
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

应用程序将在临时目录中使用项目,直到用户决定保存它为止,在这种情况下,我将使用D.B。的建议将项目文件复制到新目录。

1 个答案:

答案 0 :(得分:0)

如何继续完全取决于您和您的项目要求。这实际上取决于这些文件将被用于什么,它们将如何被维护等。使用模板似乎是一个很好的解决方案,因为在生成一组新项目时,您可以简单地替换模板中的变量/标记文件。这些模板是否以某种方式打包/压缩再次取决于您。如果你有充分的理由打包或拉链,那么就这样做,如果没有,那么他们真的没理由这么做。

如果使用模板,基本技术将是:读取模板,通过用值替换变量/标记来处理模板,将结果数据写入新文件。

如果您正在使用Java 1.7或更高版本,请查看java.nio包和tutorial for Java file I/O featuring NIO,因为它非常好,将帮助您了解API以及如何使用它来操纵文件。

希望这有助于您入门。

编辑 - 以下是我在评论中承诺的更新:

据我所知,程序必须将一组静态文件复制到一个新目录中。因为你有一个"项目"正在进行的概念我不认为代码应该替换现有文件,因此如果项目文件已经存在,则该程序将失败。

假设:

  1. 静态模板文件将驻留在应用程序jar文件的当前工作目录中的文件夹中。也就是说,如果您的可执行jar位于文件夹C:\ MyProgram(假设是Windows文件系统),那么您的模板将存在于该文件夹中的文件夹中 - 例如C:\ MyProgram \ templates。
  2. 程序应该创建整个目录树结构,包括"项目"文件夹中。
  3. 以下是代码:

    <强> SaveProjectFolderMain.java

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class SaveProjectFolderMain {
    
        //Note: In eclipse your templates folder must be inside the eclipse project's root directory 
        //      in order for this path to be correct. E.g. myProject/templates
        //      If this program is run outside of eclipse it will look for a templates folder
        //      in the current working directory - the directory in which the jar resides.
        //      E.g. if you jar lives in C:\myProgram then your templates should live in
        //      C:\myProgram\templates (obviously this is a Windows file system example)
        private static final Path TEMPLATES_DIR = Paths.get("templates");
    
        public static void main(String[] args) {
            //Copies the template files to a new folder called "testProject"
            // creating the project folder if it does not exist.
            saveProjectDir(Paths.get("testProject"));
        }
    
        public static void saveProjectDir(Path dirToSaveTo){
            try {
                if(!Files.exists(dirToSaveTo)){
                    System.out.println("The directory " + dirToSaveTo.toAbsolutePath() + " does not exist, it is being created.");
                    Files.createDirectories(dirToSaveTo);
                }
                Files.walkFileTree(TEMPLATES_DIR, new CopyFileVisitor(dirToSaveTo));
            } catch (IOException e) {
                System.err.println("Unable to copy template files to the save location: " + dirToSaveTo.toAbsolutePath());
                e.printStackTrace();
            }
        }
    
    }
    

    <强> CopyFileVisitor.java

    import java.io.IOException;
    import java.nio.file.FileVisitResult;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.SimpleFileVisitor;
    import java.nio.file.attribute.BasicFileAttributes;
    
    public class CopyFileVisitor extends SimpleFileVisitor<Path> {
        private final Path targetPath;
        private Path sourcePath = null;
    
        public CopyFileVisitor(Path targetPath) {
            this.targetPath = targetPath;
        }
    
        @Override
        public FileVisitResult preVisitDirectory(final Path dir,
                final BasicFileAttributes attrs) throws IOException {
            if (sourcePath == null) {
                sourcePath = dir;
            } else {
                Path destDir = targetPath.resolve(sourcePath.relativize(dir));
                System.out.println("Creating directory: " + destDir);
                Files.createDirectories(destDir);
            }
            return FileVisitResult.CONTINUE;
        }
    
        @Override
        public FileVisitResult visitFile(final Path file,
                final BasicFileAttributes attrs) throws IOException {
            Path destFilePath = targetPath.resolve(sourcePath.relativize(file));
            System.out.println("Copying " + file.toAbsolutePath() + " to " + destFilePath.toAbsolutePath());
            Files.copy(file, destFilePath);
            return FileVisitResult.CONTINUE;
        }
    }