24

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?

Joseph Kingry
  • 7,959
  • 4
  • 31
  • 51

1 Answers1

35

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.

Joseph Kingry
  • 7,959
  • 4
  • 31
  • 51
  • 3
    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 – Neil Apr 24 '12 at 12:03
  • 1
    @Neil yes, this would be after the move and yes it would make it no longer atomic. – Joseph Kingry Apr 25 '12 at 13:27
  • 3
    @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. http://stackoverflow.com/a/12821819/486660 – Jim Oct 10 '12 at 18:57
  • Is this also necessary when copying a file or are the permissions automatically inherited in that case? – Caleb Seadon Jul 02 '17 at 22:21