[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]