C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, MacOS, iOS & Android operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs. There is a free C++ Builder Community Edition for students, beginners, and startups.
C++ Builder has Path Manipulation Routines that allow users to edit, extract, get and set drive name, directory name, file name, and file extensions. These methods are found in the Vcl.FileCtrl, System.IOUtils, System.SysUtils libraries. These path manipulation methods are easy to use and with them it’s easy to get or set file path strings in that operating system. The routines can be used with other component properties like FileName property of OpenDialog, SaveDialog components.
Let’s see how we can use SetAttributes Method to set File Attributes from given a file or directory path String on Windows.
What is the SetAttributes method?
The SetAttributes method (System::SysUtils::SetAttributes) is a Path Manipulation Routine that sets the file or directory attributes. We can call the SetAttributes method to apply a new set of attributes to a given file or directory.
Syntax:
1 2 3 |
static void __fastcall SetAttributes(const System::UnicodeString Path, const TFileAttributes Attributes); |
Here;
The Path is the path to the file or directory for which the attributes are obtained.
The Attributes is the set of file or directory attributes.
Is there a C++ example of how to set file attributes?
Of course! Here’s a simple example to of how to set file attributes.
We can separate drives and folders in a path string with “\\” to define single \ and we can get attributes of a given file path string as below,
1 2 3 4 5 6 |
TFileAttributes attr = TFile::GetAttributes( L"D:\\MainFolder\\SubFolder\\myimage.jpg" ); attr << TFileAttribute::faReadOnly; // turn flag bit on TFile::SetAttributes( str, attr ); |
As you see in this example, we can easily set the attribute ReadOnly to ON. In C++ Builder, we can set this ReadOnly flag to OFF as example below
1 2 3 4 5 6 |
TFileAttributes attr = TFile::GetAttributes( L"D:\\MainFolder\\SubFolder\\myimage.jpg" ); attr >> TFileAttribute::faReadOnly; // turn flag bit off TFile::SetAttributes( str, attr ); |
What file attributes are available and what do they mean?
TFileAttributes represents a set of file or directory attributes. It is a set of file or directory attributes. The TFileAttributes enumeration is used in file operation routines, which modify, read, or remove attributes from a file or directory. The following are possible values of TFileAttribute:
Value | Meaning |
---|---|
faReadOnly | Identifies read-only files or directories. |
faHidden | Identifies hidden files or directories. |
faSystem | Identifies system files or directories. |
faDirectory | Identifies a directory. |
faArchive | Identifies Windows archived files. |
faDevice | Identifies Windows device files. |
faNormal | Identifies normal files. |
faTemporary | Identifies temporary files or directories. |
faSparseFile | Identifies a sparse file. A sparse file is a large file filled mostly with zeros. |
faReparsePoint | Identifies a reparse point. A reparse point is a block of user-defined data linked to a real file or directory. |
faCompressed | Identifies a compressed file or directory. |
faOffline | Identifies an offline file whose contents are unavailable. |
faNotContentIndexed | Identifies a file that is skipped from the indexing operations. |
faEncrypted | Identifies an encrypted file or directory. |
faSymLink | Identifies a symbolic link. |
Note that there are TFileAttributes enumeration and TFileAttribute without plural s. One defines all atributes other defines defined attribute (i.e. TFileAttribute::ReadOnly). So be careful about if it is singular or plural when you are using them, because both has different usage.
This method is very useful when you want to set file attributes. Here is the simple full C++ Builder VCL Example,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <vcl.h> #include <System.IOUtils.hpp> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { String str = L"D:\\MainFolder\\SubFolder\\myimage.jpg"; try { TFileAttributes attr = TFile::GetAttributes(str); if( attr.Contains(TFileAttribute::faReadOnly) ) { attr >> TFileAttribute::faReadOnly; // turn bit off TFile::SetAttributes( str, attr ); } else { attr << TFileAttribute::faReadOnly; // turn bit on TFile::SetAttributes( str, attr ); } } catch(Exception &e) { throw(e); } } |
We can use this method with path properties of other components. For example, here is a full example with OpenDialog componant that uses it’s FileName property and switches this file ReadOnly flag to ON or OFF,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <vcl.h> #include <System.IOUtils.hpp> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if( OpenDialog1->Execute() ) { try { TFileAttributes attr = TFile::GetAttributes( OpenDialog1->FileName ); if( attr.Contains(TFileAttribute::faReadOnly) ) { attr >> TFileAttribute::faReadOnly; // turn bit off TFile::SetAttributes( str, attr ); } else { attr << TFileAttribute::faReadOnly; // turn bit on TFile::SetAttributes( str, attr ); } } catch(Exception &e) { throw(e); } } } |
In this example, user selects file by using OpenDialog file browser and it sets its ReadOnly to OFF if it is ReadOnly vice verse. Note that you can use ^= bitwise operator.to switch bits too.
RAD Studio C++ Builder is a great environment for learning to use C++ and is also powerful enough for all your professional and beginner development needs.
You can download and use the latest C++ Builder Community Edition for free subject to some conditions. If you want to go even further or don’t qualify for the Community Edition why not download and try the C++ Builder trial version?