Встроенные функции поддержки не имеют подпрограммы для этого.
Так что это сводится к одному из нескольких других вариантов.
- Вы можете вызвать
ShellExecute
, используя attrib -r C:\path\FileName.txt
- Вы можете встроить эту функциональность в DLL и импортировать DLL
- Вы можете использовать COM-объект для этого
- Вызовите Windows API напрямую. ОБНОВЛЕНО
Вот пример функции, которая делает это с COM
procedure RemoveReadOnly(FileSpec : String);
var
FSO : Variant;
File : Variant;
begin
FSO := CreateOleObject('Scripting.FileSystemObject');
File := FSO.GetFile(FileSpec);
if File.attributes and 1 then // Check if Readonly already
File.attributes := File.attributes - 1;
end;
MSDN Содержит документацию по FilesSystemObject и использованиеиз Атрибуты .
ОБНОВЛЕНО
Вот пример прямого вызова Windows API, который является наилучшим вариантом.
function GetFileAttributes(lpFileName: PAnsiChar): DWORD;
external 'GetFileAttributesA@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: PAnsiChar;
dwFileAttributes: DWORD): BOOL;
external 'SetFileAttributesA@kernel32.dll stdcall';
procedure RemoveReadOnly(FileName : String);
var
Attr : DWord;
begin
Attr := GetFileAttributes(FileName);
if (Attr and 1) = 1 then
begin
Attr := Attr -1;
SetFileAttributes(FileName,Attr);
end;
end;