Gradle学习笔记之文件操作

Gradle中的文件操作方式有五种:本地文件、文件集合、文件树、文件拷贝和归档文件。

本地文件

比较简单,API跟java中的完全一致:

task("test_file") {
    doFirst {
        def f1 = file("../test.txt")
        if (!f1.exists()) {
            f1.createNewFile()
        }

        def f2 = file("D:/develop/ideaWorkspace/GradleTest/test2.txt")
        if (!f2.exists()) {
            f2.createNewFile()
        }

        def f3 = new File("src")
        println f3.absolutePath
    }
}

文件集合

Gradle中的文件集合用file()创建,既可以遍历,也支持+-+=-=运算符,也可以转换成SetList等集合:

task("test_file_collections") {
    doFirst {
        def file_cols = files( // 创建文件集合
                "../test1.txt",
                file("../test2.txt"),
                new File("../test3.txt"),
                ["../test4.txt", "../test5.txt"])

        file_cols.forEach({ // 遍历文件集合
            File file -> { 
                if (!file.exists()) {
                    file.createNewFile()
                }
                println file.absolutePath
            }
        })

        // 将文件集合转换成Set或List,并且遍历
        Set s1 = file_cols.files
        Set s2 = file_cols as Set

        List list = file_cols as List
        list.forEach({
            println it.name
        })

        // 文件集合的操作符操作
        file_cols += file("../test6.txt")
        file_cols -= file("../test1.txt")

        println "========================================"
        file_cols.forEach({
            if (it != null) {
                println it.absolutePath
            }
        })

    }
}

输出结果:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_collections

> Task :lib1:test_file_collections
D:\develop\ideaWorkspace\GradleTest\test1.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
========================================
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
D:\develop\ideaWorkspace\GradleTest\test6.txt

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

相关文件均可以被创建出来:
在这里插入图片描述

文件树

文件树继承自文件集合,通过fileTree()创建,用来遍历某目录下的所有文件(包括子目录及子目录中的文件),并且可以指定包含和过滤方法:

task "test_file_tree" {
    doFirst {
        def tree = fileTree("../").include("**/*.txt") // 方式1,使用路径创建文件树,通过include()/exclude()等方法设置过滤原则

        def tree2 = fileTree("../") { // 方式2,使用路径+闭包的形式创建文件树,过滤原则写在闭包中
            include "**/*.txt"
        }

        def tree3 = fileTree( // 方式3,使用参数映射的方式创建文件树
                dir: "../",
                includes: ["**/*.txt"], excludes: ["**/*1*", "**/*4*"])

        tree3.each({ // 遍历文件树中的文件
            File f -> {
                println f.absolutePath
            }
        })
    }
}

输出效果如下:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_tree

> Task :lib1:test_file_tree
D:\develop\ideaWorkspace\GradleTest\test.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

文件拷贝

通过类型为Copy的函数实现:

task "CopyTask" (type: Copy) {
    from ("../src", "../test1.txt", zipTree("../test.zip"))
    into "../src_copied" // 目的目录不存在时,会自动创建
}

from参数为一个目录,则将目录下的所有内容(不包括目录本身)复制到目的目录;若from参数为一个文件,则复制文件本身;若from参数为一个zipTree压缩包,则将压缩包的内容复制到目的目录。任何需要复制的内容,如果在目的目录已经存在,则不会再一次复制。

我们也可以通过includeexcluderename等函数或闭包,实现复制文件的包含、排除和复制后的重命名:

task "CopyTask" (type: Copy) {
    from ("../src", "../test1.txt", zipTree("../test.zip"))
    into "../src_copied"

    // 包含
    include "**/*.txt"

    // 排除
    exclude {
        it.file.name.contains("3") || !it.file.name.endsWith(".txt")
    }

    // 复制后的重命名
    rename {String filename -> {
        filename.replace(".txt", ".txt.bak")
    }}
}

执行任务后的效果:
在这里插入图片描述
我们也可以在普通任务中使用copy闭包执行复制任务:

task "copy_2" {
    doFirst {
        copy {
            from ("../src", "../test1.txt", zipTree("../test.zip"))
            into "../src_copied"

            include "**/*.txt"
            exclude {
                it.file.name.contains("3") || !it.file.name.endsWith(".txt")
            }

            rename {String filename -> {
                filename.replace(".txt", ".txt.bak")
            }}
        }
    }
}

或者直接通过copy闭包执行复制任务:

task "copy_2" {
    doFirst {
        copy {
            from ("../src", "../test1.txt", zipTree("../test.zip"))
            into "../src_copied"

            include "**/*.txt"
            exclude {
                it.file.name.contains("3") || !it.file.name.endsWith(".txt")
            }

            rename {String filename -> {
                filename.replace(".txt", ".txt.bak")
            }}
        }
    }
}

而后,执行该项目的gradle build即可:
在这里插入图片描述

归档文件

以打zip包为例,gradle压缩文件是通过Zip闭包任务函数实现的:

task myZip (type: Zip) {
    from "../build" // 压缩的源目录
    destinationDir(file("../")) // 压缩完成后,压缩文件的保存目录
    baseName "build_s" // 压缩完成后,压缩文件名
}

println myZip.archiveName // 输出压缩文件名

输出效果如下:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle myZip

> Configure project :lib1
build_s.zip

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own script
s or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

同时可以在指定位置找到输出文件:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值