[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]

program Delattr;

Uses Dos;


Procedure Usage;
Begin
     Writeln;
     Writeln('DELATTR (C) 1995 Scott Tunstall.');
     Writeln('Gets rid of those annoying undeletable files quickly !');
     Writeln;
     Writeln;
     Writeln('Usage:');
     Writeln;
     Writeln('DELATTR [-r] [-s] [-a] [-h] <FileSpec>');
     Writeln;
     Writeln('   -r will remove the READ ONLY attribute of a file,');
     Writeln('   -s will remove the SYSTEM attribute,');
     Writeln('   -a will remove the ARCHIVE attribute,');
     Writeln('   -h will remove the HIDDEN attribute.');
     Writeln;
     Writeln;
     Writeln('If you do not specify any attribute parameters, the');
     Writeln('program assumes you want to remove ALL of the');
     Writeln('specified file''s attributes. Or Something. :-) ');
     Writeln;
     Writeln('Use ATTRIB if all you want to do is ADD or VIEW ');
     Writeln('the attributes of file(s).');
     Writeln;
End;


Procedure BreakDownMask(TheMask: Word);
Begin
     If TheMask <>0 Then
        Begin
        If TheMask AND Archive = Archive Then
           Write('A ');
        If TheMask AND Directory = Directory Then
           Write('D ');
        If TheMask AND Hidden = Hidden Then
           Write('H ');
        If TheMask AND ReadOnly = ReadOnly Then
           Write('R ');
        If TheMask AND SysFile = SysFile Then
           Write('S ');
        If TheMask AND VolumeID = VolumeID Then
           Write('V ');
        End
     Else
         Write('NULL ');
End;


{
ReadOnly     ³  $01
Hidden       ³  $02
SysFile      ³  $04
VolumeID     ³  $08
Directory    ³  $10
Archive      ³  $20
AnyFile      ³  $3F
}

Procedure DoAttrib;
Var Count: Byte;
    FileToChange: File;
    TempParam: string;
    CurrentByteMask: Word;
    ByteMask : Word;
    SearchRc: SearchRec;

Begin
     ByteMask:=0;
     If ParamCount = 1 Then
        ByteMask:=$2f
     Else
         For Count:=1 to (ParamCount -1) do
             Begin
             TempParam:=ParamStr(Count);
             If TempParam[1] = '-' Then
             Begin
                Case upcase(TempParam[2]) of
                'A': ByteMask:=ByteMask OR Archive;
                'D': ByteMask:=ByteMask OR Directory;
                'H': ByteMask:=ByteMask OR Hidden;
                'R': ByteMask:=ByteMask OR ReadOnly;
                'S': ByteMask:=ByteMask OR SysFile;
                'V': ByteMasK:=ByteMask OR VolumeID;
                Else
                    Begin
                    Write(chr(7));
                    Writeln(Paramstr(Count),' is not a valid switch !');
                    Halt;
                    End
                End;
                End
             Else
                 Begin
                 Write(chr(7));
                 Writeln(ParamStr(Count),' is not recognised as a switch !');
                 Halt;
                 End;
         End;

     FindFirst(ParamStr(ParamCount),AnyFile, SearchRc);
     If DosError =0 Then
        Begin
        While DosError = 0 do
              Begin
              Assign(FileToChange,SearchRc.Name);
              GetFAttr(FileToChange,CurrentByteMask);

              If CurrentByteMask <>0 Then
                 Begin

                 CurrentByteMask:=CurrentByteMask AND (65535 - ByteMask);
                 If ByteMask <>$2f Then
                    Begin
                    Write('Changed attributes of ',SearchRc.Name,' to ');
                    BreakDownMask(CurrentByteMask);
                    End
                 Else
                     Write('Removed all attributes from ',SearchRc.Name);

                 SetFAttr(FileToChange,CurrentByteMask);

                 If DosError = 0 Then
                    Write(' [OK].')
                 Else
                     Write('[Access Denied]');

                 Writeln;

                 FindNext(SearchRc);
                 End
              Else
                  Begin
                  Writeln(SearchRc.Name, ' has no file attributes [OK].');
                  FindNext(SearchRc);
              End;
        End;

        Writeln;
        Writeln('Operation complete.');
        Writeln;

        End
     Else
         Begin
         Writeln('Could not find the specified file(s) !');
         Writeln;
         End;
End;





Begin
     If ParamCount = 0 Then
        Usage
     Else
         Doattrib;
End.


[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]