|
Вопрос # 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.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|