| 
| 
 | Вопрос # 786/ вопрос открыт / | 
 |  Здравствуйте! Создаваемая программа записывает некую информацию в текстовый файл (именно текстовый, запись производится только с помощью writeln), можно ли сделать так, чтобы этот файл был доступен к просмотру и редактированию только из моей программы? 
|  |   Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)Вопрос отправлен: 24 июля 2007, 16:23
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Полушин Сергей Анатольевич!можно, но открывать надо уже апи функциями.
 Например так
 var fs:TFileStream;
 begin
 fs:=TFileStream.create(\'x.txt\',fmShareExclusive+fmCreate);// или заменить на fmOpenReadWrite	 последний параметр, если файл удалять не надо
 fs.write(@(s[1],length(s));//записали строку s
 fs.free; - закрыли файл
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 24 июля 2007, 16:40
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо, принцип более чем понятен |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 25 июля 2007, 23:05; участников в обсуждении: 4. 
|   | Градов Ю.М. (статус: 8-ой класс), 24 июля 2007, 22:24 [#1]:Поясните вопрос. Вы пишите, что запись файла должна осуществляться с помощью функции Writeln (только), чтобы потом Вы могли просматривать и редактировать файл только из Вашей программы. Тогда Вам необходимо шифровать файл перед записью, а при чтении его дешифровать. Пишите, попытаюсь помочь. |  
|   | Dron (статус: Студент), 24 июля 2007, 22:32 [#2]:Кстати говоря, всё это заблокирует файл лишь на то время, пока программа будет его использовать, т.е. с того момента, когда она его откроет и до тех пор, пока не закроет. А после этого файл снова станет доступен... Чтобы файл действительно было невозможно редактировать (или хотя бы усложнить эту задачу), его нужно либо шифровать, как указал Градов Ю.М., либо спрятать куда-нибудь, где его будет сложно найти. А лучше - оба метода сразу. Конечно, если речь шла только о том моменте, пока программа его использует, вопрос закрыт.
 С уважением. |  
|   | Полушин Сергей Анатольевич (статус: Посетитель), 25 июля 2007, 00:15 [#3]:хотелось бы сделать файл недоступным на тот момент, когда программа его не использует |  
|   | Полушин Сергей Анатольевич (статус: Посетитель), 25 июля 2007, 00:19 [#4]:как я понял файл нужно шифровать, тогда сообщайте как, будем оценивать ваши ответы |  
|   | Вадим К (статус: Академик), 25 июля 2007, 11:11 [#5]:Зачем блокировать файл на все время работы? что бы враг не догадался, что вы там пишете? Помните, были приценденты, кодга за скрытые/недоступные файлы компании имели большие неприятности. Например достаточно вспомнить последний случай с Sony. По при особом желании заблокировать файл можно поступить так. Пишеться сервис, который открывает файл и отдаст только когда об этом попросит своя программа.
 Если владеете С++, то можно и драйвер для файловой системы написать.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Градов Ю.М. (статус: 8-ой класс), 25 июля 2007, 23:05 [#6]:unit Q786; 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
 
 type
 TForm1 = class(TForm)
 Memo1: TMemo;
 Button1: TButton;
 Button2: TButton;
 OpenDialog1: TOpenDialog;
 SaveDialog1: TSaveDialog;
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 type
 ECryptError = class(Exception);
 
 var
 Form1: TForm1;
 F: TextFile;
 
 const
 csCryptFirst = 20;
 csCryptSecond = 230;
 csCryptHeader = \'Crypted\';
 
 implementation
 
 {$R *.dfm}
 
 procedure TForm1.Button1Click(Sender: TObject);
 var St: string;
 function UnCryptString(Str:String):String;
 var i, clen : Integer;
 begin
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)-clen);
 if Copy(Str,1,clen)<>csCryptHeader then
 raise ECryptError.Create(\'Дешифрация не возможна!!!\');
 for i := 1 to Length(Str)-clen do
 begin
 if (i) mod 2 = 0 then
 Result[i] := Chr(Ord(Str[i+clen]) xor csCryptFirst)
 else
 Result[i] := Chr(Ord(Str[i+clen]) xor csCryptSecond);
 end;
 end;
 begin
 if OpenDialog1.Execute then
 begin
 Memo1.Clear;
 AssignFile(F, OpenDialog1.FileName);
 Reset(F);
 While not Eof(F) do
 begin
 Readln(F,St);
 Memo1.Lines.Add(UnCryptString(St));
 end;
 CloseFile(F);
 end;
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 var St: string;
 j: integer;
 function CryptString(Str:String):String;
 var i,clen : Integer;
 begin
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)+clen);
 Move(csCryptHeader[1], Result[1], clen);
 For i := 1 to Length(Str) do
 begin
 if i mod 2 = 0 then
 Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)
 else
 Result[i+clen] := Chr(Ord(Str[i]) xor csCryptSecond);
 end;
 end;
 begin
 if SaveDialog1.Execute then
 begin
 AssignFile(F,SaveDialog1.FileName);
 Rewrite(F);
 for j:=1 to Memo1.Lines.Count do
 begin
 Writeln(F,CryptString(Memo1.Lines.Strings[j]));
 end;
 CloseFile(F);
 end;
 end;
 
 end.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |