C# How to: Changing a File’s read only attribute

When working on certain types of projects you might find a commonly used/repeated task being able to determine and manipulate a file’s read only attribute. This article provides a discussion on how to determine whether a file is read only or not, provides three different methods of setting a file to read only and provides three different methods of negating a file’s read only status.

The topics discussed in this article is focussed around a Console based sample application. You can download the complete Visual Studio project source code here.

How to determine if a file is read only or not

The System.IO.FileInfo class exposes the Boolean property IsReadOnly. It is important to note that the FileInfo.IsReadOnly property reflects a file’s read only status at the point in time when the FileInfo object was instantiated or the last time the FileInfo.Refresh() method was invoked. The ReadOnly property reflects a snapshot of a file’s read only status. If a file’s read only attribute is manipulated after FileInfo object instantiation or after invoking the Refresh() method the ReadOnly property will not reflect any changes that may have occurred subsequently. It is therefore good practice to invoke FileInfo.Refresh() before accessing the ReadOnly property in order to safeguard against file attribute changes your application may be unaware of.

 private static void DisplayFileStatus(FileInfo fileInfo)
 {
     fileInfo.Refresh();
 
     Console.WriteLine("File read only: " +
         (fileInfo.IsReadOnly ? "Yes" : "No" ));
 }

The sample code provided with this article implements the DisplayFileStatus method as an easily reusable method of determining a file’s read only status and displaying the result to the Console.

Creating a new file

 Console.WriteLine("Creating new file...");
 StreamWriter streamWriter = File.CreateText("ReadOnlyFile.txt");
 streamWriter.WriteLine("This is a code sample from http://softwarebydefault.com");
 streamWriter.Close();
 Console.WriteLine("File Created.");
 
 FileInfo fileInfo = new FileInfo("ReadOnlyFile.txt");
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

The code snippet listed above creates a new file called “ReadOnlyFile.txt” by implementing the File.CreateText(string) method. The CreateText() method returns an object of type StreamWriter, which is then used to write a text string to the newly created file, after which the open file handle is released by invoking StreamWriter.Close().

Furthermore the code snippet illustrates instantiating an object of type FileInfo, which is specified to reference the previously newly created file. The file’s read only attribute gets output to the Console by invoking the DisplayFileStatus() method discussed earlier.

Setting a file to read only – Method 1

 Console.WriteLine("Attempting to set read only: method 1");
 fileInfo.IsReadOnly = true;
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

This method simply sets the property FileInfo.IsReadOnly to true and then determines and output the file’s read only attribute.

Setting a file to read only – Method 2

 Console.WriteLine("Attempting to set read only: method 2");
 File.SetAttributes("ReadOnlyFile.txt", FileAttributes.ReadOnly);
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

Method 2 invokes the File class’ SetAttributes method, passing as parameters the name of the file created earlier and the enumeration value FileAttributes.ReadOnly.

Setting a file to read only – Method 3

 Console.WriteLine("Attempting to set read only: method 3");
 fileInfo.Attributes = fileInfo.Attributes | FileAttributes.ReadOnly;
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

The third method, shown in the code snippet above, updates the value of the FileInfo class’ FileInfo.Attributes property, which is an enumeration of type System.IO.FileAttributes. The FileAttributes enumeration as part of its declaration implements [FlagsAttribute].

When an enumeration’s declaration includes the attribute FlagsAttribute, it is an indication that the enumeration is to be used as a bit field, also commonly referred to as flags. When regarding the FileInfo.Attributes property as a bit field it logically follows that bitwise operations can be performed.

The code snippet performs a bitwise OR operation specifying the enumeration value FileAttributes.ReadOnly. If the FileInfo.Attributes bit field property is already set to include FileAttributes.ReadOnly, performing a bitwise OR operation will have no effect. Inversely, if  FileInfo.Attributes is not set to include FileAttributes.ReadOnly, the bitwise OR operation will set the flag to true. 

Removing a file’s read only attribute – Method 1

 Console.WriteLine("Attempting to undo read only: method 1");
 fileInfo.IsReadOnly = false;
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

The first method shown to remove a file’s read only attribute functions by achieving the exact opposite of the first method shown in setting a file to read only. Updating the value of the FileInfo.IsReadOnly Boolean property to false results in the referenced file no longer being read only.

Removing a file’s read only attribute – Method 2

 Console.WriteLine("Attempting to undo read only method 2");
 File.SetAttributes("ReadOnlyFile.txt", ~FileAttributes.ReadOnly);
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

The code snippet above illustrates the second method of updating a file to not include the read only attribute. In a similar fashion to the first method described the second method implements the code required to achieve an effect opposite to that of the second method of setting a file to read only. By making use of the ~ operator a bitwise compliment operation is performed on FileAttributes.ReadOnly, the result of which is passed as a parameter to the File.SetAttributes method. An alternative explanation could be stated as reversing the bit values represented by the enumeration member FileAttributes.ReadOnly before applying the reversed bit values as a parameter to the File.SetAttributes method.

Removing a file’s read only attribute – Method 3

 Console.WriteLine("Attempting to undo read only: method 3");
 fileInfo.Attributes = fileInfo.Attributes & ~FileAttributes.ReadOnly;
 DisplayFileStatus(fileInfo);
 Console.WriteLine();

The third method, as listed above, updates FileInfo.Attributes, which is an enumeration property of type System.IO.FileAttributes, but also a bit field as discussed earlier. Based on the rules of operator precedence the bitwise compliment (~ operator) will be evaluated first, thereafter the bitwise AND operation will be executed. Reversing the bit values of FileAttributes.ReadOnly then applying the resulting values as an operand to a bitwise AND operation results in removing FileAttributes.ReadOnly as a flag set on the FileInfo.Attributes property.

Complete Sample Code

The code listing below represents the entire code sample. You can also download the complete Visual Studio project source code here.

 /*
  * The Following Code was developed by Dewald Esterhuizen
  * View Documentation at: http://softwarebydefault.com
  * Licensed under Ms-PL 
 */
 using  System;
 using  System.Collections.Generic;
 using  System.Linq;
 using  System.Text;
 using  System.IO;
 
 namespace ReadOnlyFiles
 {
     class Program
     {
         static void Main(string [] args)
         {
             Console.WriteLine("Creating new file...");
             StreamWriter streamWriter = File.CreateText("ReadOnlyFile.txt");
             streamWriter.WriteLine("This is a code sample from http://softwarebydefault.com");
             streamWriter.Close();
             Console.WriteLine("File Created.");
 
             FileInfo fileInfo = new FileInfo("ReadOnlyFile.txt");
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to set read only: method 1");
             fileInfo.IsReadOnly = true;
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to undo read only: method 1");
             fileInfo.IsReadOnly = false;
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to set read only: method 2");
             File.SetAttributes("ReadOnlyFile.txt", FileAttributes.ReadOnly);
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to undo read only method 2");
             File.SetAttributes("ReadOnlyFile.txt", ~FileAttributes.ReadOnly);
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to set read only: method 3");
             fileInfo.Attributes = fileInfo.Attributes | FileAttributes.ReadOnly;
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Attempting to undo read only: method 3");
             fileInfo.Attributes = fileInfo.Attributes & ~FileAttributes.ReadOnly;
             DisplayFileStatus(fileInfo);
             Console.WriteLine();
 
             Console.WriteLine("Press any key...");
             Console.ReadKey();
 
             File.Delete("ReadOnlyFile.txt");
         }
 
         private static void DisplayFileStatus(FileInfo fileInfo)
         {
             fileInfo.Refresh();
 
             Console.WriteLine("File read only: "+
                 (fileInfo.IsReadOnly ? "Yes" : "No"));
         }
     }
 }
[tweetmeme source=”DefaultSoftware” only_single=”false”]
Advertisements

0 Responses to “C# How to: Changing a File’s read only attribute”



  1. Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s




Dewald Esterhuizen

Blog Stats

  • 483,725 hits

Enter your email address to follow and receive notifications of new posts by email.

Join 213 other followers

Archives

Twitter feed


%d bloggers like this: