Delphi настроен на чтение только файлов из папки и подпапок

Как я могу сделать файлы из определенной папки и подпапок доступными только для чтения в delphi? Я знаю, что могу поместить папку с FileSetAttr только для чтения, но есть ли способ поместить файлы из папки и подпапок?

Спасибо


person user3297864    schedule 16.02.2014    source источник
comment
Вызовите функцию FileSetAttr для каждого файла, который вы найдете в папке и ее подпапках. Для этого поиска используйте FindFirst, FindNext.   -  person TLama    schedule 17.02.2014
comment
@TLama: это ответ, а не комментарий.   -  person Remy Lebeau    schedule 17.02.2014


Ответы (1)


Вам нужно перебрать все файлы в каталоге и рекурсивно по всем подкаталогам. Вы можете использовать эту функцию, чтобы сделать это:

type
  TFileEnumerationCallback = procedure(const Name: string);

procedure EnumerateFiles(const Name: string; 
  const Callback: TFileEnumerationCallback);
var
  F: TSearchRec;
begin
  if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin
    try
      repeat
        if (F.Attr and faDirectory <> 0) then begin
          if (F.Name <> '.') and (F.Name <> '..') then begin
            EnumerateFiles(Name + '\' + F.Name, Callback);
          end;
        end else begin
          Callback(Name + '\' + F.Name);
        end;
      until FindNext(F) <> 0;
    finally
      FindClose(F);
    end;
  end;
end;

Это рутина общего назначения. Вы можете предоставить процедуру обратного вызова, которая будет вызываться с именем каждого файла. Внутри этой процедуры обратного вызова делайте все, что хотите.

Ваша процедура обратного вызова будет выглядеть так:

procedure MakeReadOnly(const Name: string);
begin
  FileSetAttr(Name, FileGetAttr(Name) or faReadOnly);
end;

И вы бы соединили это так:

EnumerateFiles('C:\MyDir', MakeReadOnly);
person David Heffernan    schedule 16.02.2014