Delete task
Deletes the specified files.
Parameters
The following table describes the parameters of the Delete
task.
Parameter | Description |
---|---|
DeletedFiles |
Optional ITaskItem[] output parameter.Specifies the files that were successfully deleted. |
Files |
Required ITaskItem[] parameter.Specifies the files to delete. |
TreatErrorsAsWarnings |
Optional Boolean parameterIf true , errors are logged as warnings. The default value is false . |
Remarks
In addition to the parameters listed above, this task inherits parameters from the TaskExtension class, which itself inherits from the Task class. For a list of these additional parameters and their descriptions, see TaskExtension base class.
Warning
Be careful when you use wildcards with the Delete
task. You can easily delete the wrong files with expressions like $(SomeProperty)\**\*.*
or $(SomeProperty)/**/*.*
, especially if the property evaluates to an empty string, in which case the Files
parameter can evaluate to the root of your drive and delete much more than you wanted to delete.
Examples
The following example deletes the file ConsoleApp1.pdb when you build the DeleteDebugSymbolFile
target.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<AppName>ConsoleApp1</AppName>
</PropertyGroup>
<Target Name="DeleteDebugSymbolFile">
<Message Text="Deleting $(OutDir)$(AppName).pdb"/>
<Delete Files="$(OutDir)$(AppName).pdb" />
</Target>
</Project>
If you need to track the deleted files, set TaskParameter
to DeletedFiles
with the item name, as follows:
<Target Name="DeleteDebugSymbolFile">
<Delete Files="$(OutDir)$(AppName).pdb" >
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
</Delete>
<Message Text="Deleted files: '@(DeletedList)'"/>
</Target>
Instead of directly using wildcards in the Delete
task, create an ItemGroup
of files to delete and run the Delete
task on that. But, be sure to place the ItemGroup
carefully. If you put an ItemGroup
at the top level in a project file, it gets evaluated early on, before the build starts, so it won't include any files that were built as part of the build process. So, put the ItemGroup
that creates the list of items to delete in a target close to the Delete
task. You can also specify a condition to check that the property is not empty, so that you won't create an item list with a path that starts at the root of the drive.
The following example, all files with the extension .orig
in a particular folder are deleted.
<Project>
<Target Name="DeleteFiles" AfterTargets="Build">
<ItemGroup>
<FilesToDelete Include="source\*.orig"/>
</ItemGroup>
<Message Text="Deleting Files @(FilesToDelete)"/>
<Delete Files="@(FilesToDelete)">
<Output
TaskParameter="DeletedFiles"
ItemName="FilesDeleted"/>
</Delete>
<Message Text="Files deleted: @(FilesDeleted)"/>
</Target>
</Project>
Note
When using wildcards for deletion of files generated during the build process, be aware of when in the build process the wildcard expansion occurs. In the previous example, the ItemGroup
with the wildcard expansion is in the same target as the deletion, which ensures that any file built prior to that target is included in the deletion list. Item groups at the top level are expanded at evaluation time, which would miss any files generated later in the build process.
The Delete
task is intended for deleting files. If you want to delete a directory, use RemoveDir.
The Delete
task doesn't provide an option to delete read-only files. To delete read-only files, you can use the Exec
task to run the del
command or equivalent, with the appropriate option to enable deleting read-only files. You have to pay attention to the length of the input item list, since there is a length limitation on the command line, as well as making sure to handle filenames with spaces, as in this example:
<Target Name="DeleteReadOnly">
<ItemGroup>
<FileToDelete Include="read only file.txt"/>
</ItemGroup>
<Exec Command="del /F /Q "@(FileToDelete)""/>
</Target>
In general, when writing build scripts, consider whether your deletion is logically part of a Clean
operation. If you need to set some files to be cleaned as part of a normal Clean
operation, you can add them to the @(FileWrites)
list and they will be deleted on the next Clean
. If more custom processing is needed, define a target and specify for it to run by setting the attribute BeforeTargets="Clean"
or AfterTargets="Clean"
, or define your custom version of the BeforeClean
or AfterClean
targets. See Customize your build.