cake: CleanDirectory does not clean readonly files.

What You Are Seeing?

Trying to run CleanDirectory() on a folder that has had some readonly files copied into it using CopyFiles() The issue is that CleanDirectory() fails with access denied on the read only files.

What is Expected?

CleanDirectory() deletes the files even if they are readonly.

What version of Cake are you using?

0.16.2

Are you running on a 32 or 64 bit system?

x64

What environment are you running on? Windows? Linux? Mac?

Windows

Are you running on a CI Server? If so, which one?

N\A

How Did You Get This To Happen? (Steps to Reproduce)

Add some readonly xsd files to ./Documents/Schemas/ and run the following cake file twice…

Task("Default")
    .Does(() =>
    {
            var schemaFolder = Argument("schemaFolder", "./artifacts/schemas");
            EnsureDirectoryExists(schemaFolder);
            CleanDirectory(schemaFolder);
            var files = GetFiles("./Documents/Schemas/*.xsd");
            CopyFiles(files, schemaFolder);
        });

RunTarget("Default");

Output Log

First Run

Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Compiling build script...

========================================
Default
========================================
Executing task: Default
Creating directory C:/Source/Main/artifacts/schemas
Cleaning directory C:/Source/Main/artifacts/schemas
Copying file main.xsd to C:/Source/Main/artifacts/schemas/main.xsd
Copying file sub.xsd to C:/Source/Main/artifacts/schemas/sub.xsd
Finished executing task: Default

Task                          Duration            
--------------------------------------------------
Default                       00:00:00.1268127    
--------------------------------------------------
Total:                        00:00:00.1268127   

Second Run

Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Compiling build script...

========================================
Default
========================================
Executing task: Default
Cleaning directory C:/Source/Main/artifacts/schemas

An Error occured when executing task 'default'.
Error: Access to the path 'C:/Source/Main/artifacts/schemas/main.xsd' is denied.

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Reactions: 1
  • Comments: 16 (8 by maintainers)

Most upvoted comments

+1

I’m trying to make my builds idempotent and when cloning a repo from git, often the .git directory contains read only files which causes DeleteDirectory or CleanDirectory to fail.

What about adding a Force boolean argument (defaulted to false) to Clean/Delete Directory? I’d be happy to contribute.

Related to #1564

Now that #1574 is merged, IFile will support changing file attributes in v0.22. This means we could have a overload which has a force option (just like we did with DeleteDirectory in #1574)

I ran into this in the context of cleaning up a git folder as well.

Instead of adding overloads to CleanDirectory, does it make sense to add a method like SetFileAttributes(globbingPattern, FileAttributes) to a package like Cake.FileHelpers or similar?

this would be indeed most useful to clean up a git folder. I would expect it as default behavior.

I have now opened PR #4077 that fully addresses this issue - please review if you get a chance.

I will work to address any matters up until this change is successfully merged.

I note this issue was opened Oct 25, 2016 which is a long time between drinks, but equally I hope it was worth the wait 😊

@devlead @WrathZA @nrjohnstone I have some time in the next week or so to work on this if we can decide the approach and still feel it’s worth doing…