# How can I delete a file from inside a task?

**URL:** https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552
**Category:** Help/Discuss
**Created:** [April 4, 2020, 7:57pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552 "2020-04-04T19:57:19Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 4, 2020, 7:57pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/1 "2020-04-04T19:57:19Z")

</div>

I’m trying to make a custom task, written in Kotlin, that generates a file through a commandline command. The problem is that this the external commandline program can’t handle if the generated file already exists.

So, what I am trying to do inside my `@TaskAction` is to delete the contents of the output directory before running the command.

I tried to do the following, but I get Gradle import errors and Project resolve errors.

```gradle
project.delete(
    fileTree("${project.buildDir}/jpackageAppImage")
)

```

When I look in the [docs for delete](https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#delete-java.lang.Object...-), it says that the input to that function can be

> Any type of object accepted by [`files(Object...)`](https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#files-java.lang.Object...-)

When I look at the [docs for files](https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#files-java.lang.Object...-), it says it accepts a a `FileTree`

Can anyone help me out with this?

---

<div class="post-metadata">

### Author: ![shadowface](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/shadowface/32/8552_2.png) [@shadowface](https://discuss.gradle.org/u/shadowface)
#### Post date: [April 4, 2020, 8:45pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/2 "2020-04-04T20:45:20Z")

</div>

try

```gradle
project.delete(
    files("${project.buildDir}/jpackageAppImage")
)

```

Or define your own task

```gradle
task deleteMyFile(type: Delete) {
    paths files("${project.buildDir}/jpackageAppImage")
}

```

---

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 4, 2020, 8:58pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/3 "2020-04-04T20:58:57Z")

</div>

The first one

```gradle
project.delete(
    files("${project.buildDir}/jpackageAppImage")
)

```

Causes the same problem 😑

---

<div class="post-metadata">

### Author: ![shadowface](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/shadowface/32/8552_2.png) [@shadowface](https://discuss.gradle.org/u/shadowface)
#### Post date: [April 4, 2020, 9:27pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/4 "2020-04-04T21:27:32Z")

</div>

this should work

```gradle
task myDeleteTask(type: Delete) {
   delete files("${buildDir}/jpackageAppImage")
}

```

---

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 4, 2020, 10:07pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/5 "2020-04-04T22:07:06Z")

</div>

Running it as a separate task worked. However, I don’t want to have to remember to create a separate delete task every time I want to create an installer task.

```gradle
tasks.register<Delete>("deleteJpackageImage") {
    delete(files("${project.buildDir}/jpackageAppImage"))
}

```

I’d really like to be able to just have the Installer task work without any outside logic. Also, I’d like to understand why `delete` inside of my task is failing so that I can have a better understanding of Gradle.

---

<div class="post-metadata">

### Author: ![shadowface](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/shadowface/32/8552_2.png) [@shadowface](https://discuss.gradle.org/u/shadowface)
#### Post date: [April 4, 2020, 10:13pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/6 "2020-04-04T22:13:52Z")

</div>

For `Delete` task you need to comply with gradle `Api` that’s why you had to create a new task that overrides the `Delete` default task from gradle.

if you want to register a task that works with `install` task you can do like this

```gradle
task myDeleteTask(type: Delete) {
   delete files("${buildDir}/jpackageAppImage")
}

myDeleteTask.mustRunAfter installerTask

```

`installerTask` is your custom installer task.

`mustRunAfter` is a gradle Api that allows to you chain tasks

---

<div class="post-metadata">

### Author: ![shadowface](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/shadowface/32/8552_2.png) [@shadowface](https://discuss.gradle.org/u/shadowface)
#### Post date: [April 4, 2020, 10:30pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/8 "2020-04-04T22:30:17Z")

</div>

You can do as follows

```gradle
task installerTask() {
    //.... your task logic goes here
    doLast {
        delete("${buildDir}/jpackageAppImage")
    }
}

```

---

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 4, 2020, 11:15pm UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/9 "2020-04-04T23:15:27Z")

</div>

> For `Delete` task you need to comply with gradle `Api` that’s why you had to create a new task that overrides the `Delete` default task from gradle.

So `Project.delete()` can only be used inside of tasks that inherit from `org.gradle.api.tasks.Delete`?

---

<div class="post-metadata">

### Author: ![shadowface](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/shadowface/32/8552_2.png) [@shadowface](https://discuss.gradle.org/u/shadowface)
#### Post date: [April 5, 2020, 12:22am UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/10 "2020-04-05T00:22:33Z")

</div>

`project.Delete()` cannot be called from outside a task or a buildScript. It also requires a path to your `File` or `Dir`

---

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 5, 2020, 12:59am UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/11 "2020-04-05T00:59:15Z")

</div>

> `project.Delete()` cannot be called from outside a task or a buildScript. It also requires a path to your `File` or `Dir`

Right, so why doesn’t it work when I do this inside a custom task inside my `build.gradle.kts`

```gradle
open class WindowsInstaller () : DefaultTask() {

...

@TaskAction
fun generateWindowsInstaller() {

    project.delete(
        fileTree("${project.buildDir}/jpackageAppImage")
    )

    ...
}
...

}

```

Unless I am misunderstanding something, [according to the docs](https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#delete-java.lang.Object...-) it should work.

---

<div class="post-metadata">

### Author: ![afafefefsaef](https://avatars.discourse-cdn.com/v4/letter/a/c6cbf5/32.png) [@afafefefsaef](https://discuss.gradle.org/u/afafefefsaef)
#### Post date: [April 5, 2020, 2:00am UTC](https://discuss.gradle.org/t/how-can-i-delete-a-file-from-inside-a-task/35552/12 "2020-04-05T02:00:25Z")

</div>

It looks like my mistake was that I needed to do `project.fileTree` instead of just `fileTree`.

```gradle
open class WindowsInstaller () : DefaultTask() {

...

@TaskAction
fun generateWindowsInstaller() {

    project.delete(
        project.fileTree("${project.buildDir}/jpackageAppImage")
    )

    ...
}
...

}

```
