Сделать текстовый файл доступным только для чтения - PullRequest
0 голосов
/ 03 апреля 2020

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

procedure TForm1.Label5Click(Sender: TObject);
var
  MyText: TStringlist;
begin
  MyText := TStringlist.create;
  try
    MyText.Add('H');
    MyText.SaveToFile(Path+'Recipte.txt');
    FileMode := fmOpenRead;
  finally
    MyText.Free;
  end;
end;

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

TStringList.SaveToFile() создает доступный для записи файл (иначе он не сможет записать в файл). Вам нужно будет использовать функцию Win32 SetFileAttributes() (или оболочку RTL FileSetAttr()), чтобы установить файл только для чтения после файла был закрыт, например:

procedure TForm1.Label5Click(Sender: TObject);
var
  MyText: TStringList;
  FileName: string;
begin
  FileName := Path + 'Recipte.txt';
  MyText := TStringList.Create;
  try
    MyText.Add('H');
    MyText.SaveToFile(FileName);
  finally
    MyText.Free;
  end;

  SetFileAttributes(PChar(FileName), FILE_ATTRIBUTE_READONLY);
  { or:
  FileSetAttr(FileName, faReadOnly);
  }
end;
0 голосов
/ 04 апреля 2020

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

Код ниже использует TFileStream для открытия файла с возможностью записи и блокирует доступ к этому файлу, чтобы сделать его доступным для чтения только для других приложений.
При необходимости вы можете заменить последний параметр на fmShareExclusive, что помешает любому другому приложению даже читать ваш файл во время его открытия вашим приложением.

procedure TForm1.Button1Click(Sender: TObject);
var
  MyText: TStringlist;
  FS: TFileStream;
begin
  MyText := TStringlist.create;
  FS := TFileStream.Create('D:\Test.txt', fmOpenWrite, fmShareDenyWrite);
  try
    MyText.Add('H');
    MyText.SaveToStream(FS);
  finally
    FS.Free;
    MyText.Free;
  end;
end;

Что касается того, чтобы запретить пользователям изменять содержимое вашего файла даже в время, когда ваше приложение не работает. Ну, это намного сложнее. Конечно, вы можете изменить атрибут файла на ReadOnly, но ваши пользователи могут изменять эти атрибуты в любое время.

Один из способов запретить вашим пользователям изменять файл - это записать его в двоичном формате, который не может быть легко читается и, следовательно, также написано людьми. Или, возможно, вы могли бы также подумать о его кодировании.

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

0 голосов
/ 03 апреля 2020

Сделайте это ресурсом. Таким образом, файл не нужно записывать на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...