File.Move does not inherit permissions from target directory?

11,593

Found what I needed was this:

var fs = File.GetAccessControl(destination);
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(destination, fs);

This resets the file permissions to inherit.

Share:
11,593

Related videos on Youtube

Joseph Kingry
Author by

Joseph Kingry

To achieve great things, two things are needed: a plan, and not quite enough time. - Leonard Berrnstein You see, wire telegraph is a kind of a very, very long cat. You pull his tail in New York and his head is meowing in Los Angeles. Do you understand this? And radio operates exactly the same way: you send signals here, they receive them there. The only difference is that there is no cat.- Albert Einstein #SOreadytohelp

Updated on April 23, 2022

Comments

  • Joseph Kingry
    Joseph Kingry about 2 years

    In case something goes wrong in creating a file, I've been writing to a temporary file and then moving to the destination. Something like:

            var destination = @"C:\foo\bar.txt";
            var tempFile = Path.GetTempFileName();
            using (var stream = File.OpenWrite(tempFile))
            {
                // write to file here here
            }
    
            string backupFile = null;
            try
            {
                var dir = Path.GetDirectoryName(destination);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                    Util.SetPermissions(dir);
                }
    
                if (File.Exists(destination))
                {
                    backupFile = Path.Combine(Path.GetTempPath(), new Guid().ToString());
                    File.Move(destination, backupFile);
                }
    
                File.Move(tempFile, destination);
    
                if (backupFile != null)
                {
                    File.Delete(backupFile);
                }
            }
            catch(IOException)
            {
                if(backupFile != null && !File.Exists(destination) && File.Exists(backupFile))
                {
                    File.Move(backupFile, destination);
                }
            }
    

    The problem is that the new "bar.txt" in this case does not inherit permissions from the "C:\foo" directory. Yet if I create a file via explorer/notepad etc directly in the "C:\foo" there's no issues, so I believe the permissions are correctly set on "C:\foo".

    Update

    Found Inherited permissions are not automatically updated when you move folders, maybe it applies to files as well. Now looking for a way to force an update of file permissions. Is there a better way overall of doing this?

  • Neil
    Neil about 12 years
    Do you have to do this once the file has already been moved? In which case it's no longer atomic - there's a risk someone could try and read the file before the permissions are in place
  • Joseph Kingry
    Joseph Kingry about 12 years
    @Neil yes, this would be after the move and yes it would make it no longer atomic.
  • Jim
    Jim over 11 years
    @JosephKingry. Thanks, this helped me out. But, I also wanted to remove any explicit permissions as a result of the Move. Just a few more lines of code. stackoverflow.com/a/12821819/486660
  • Caleb Seadon
    Caleb Seadon almost 7 years
    Is this also necessary when copying a file or are the permissions automatically inherited in that case?