Текущий архив: 2004.08.22;
Скачать: CL | DM;
Вниз
Как заставить приложение читать себя как обычный файл? Найти похожие ветки
← →
П7 (2004-08-04 16:48) [0]Товарищи!
Нужно открыть прогой себя же используя TFileStream. При попытке собственно открыть вылезает диалог с ошибкой, мол этот файл занят другим процессом. Единственный способ, который я вжу, это в реальном времени сделать копию (CopyFile пофиг, что файл запущен на выполнение) проги в temp, прочитать его и затем стереть. Но это как-то в корне не правильно. Есть ли иной способ прочитать файл?
← →
Anatoly Podgoretsky © (2004-08-04 16:52) [1]Ошибка в 17 строке
← →
Smithson © (2004-08-04 16:58) [2]Открыть файл с правами Только-на-чтение
← →
П7 (2004-08-04 16:59) [3]
> Anatoly Podgoretsky © (04.08.04 16:52) [1]
Кончай умничать - тебе не идёт. Если этим своим постом, ты показываешь мне, что мол без кода я тебе нифига не подскажу, то это показывает, что ты не знаешь, как прочитать файл используя TFileStream. Значит ты мне не поможешь. Тут ведь я не ищю ошибку у себя, как ты видимо предполагаешь. Я ищу способ чтения файла, который мне пока не известен. Понимаешь разницу? Читайте, пожалуйста, внимательней, чтобы не постить затем вот такие вот глупые неадекватные посты, типа [1].
← →
П7 (2004-08-04 17:00) [4]Ты сам пробовал? Или просто предполагаешь?
Ладно, может так действительно дело быстрее пойдёт. Вот код, если не трудно, подскажите, пожалуйста, ответ на мой вопрос:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmMain = class(TForm)
Pad: TMemo;
dlgOpen: TOpenDialog;
dlgSave: TSaveDialog;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
PathDir : string;
end;
var
frmMain: TfrmMain;
// functions
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
implementation
{$R *.dfm}
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgro?e speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
FileMode := 0;
aStream := TFileStream.Create(AFileName, fmOpenRead); // or fmShareDenyWrite
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgro?e gespeichert
aStream.Seek(SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
//aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
aStream : TMemoryStream;
begin
GetDir( 0, PathDir );
dlgOpen.InitialDir := PathDir;
dlgSave.InitialDir := PathDir;
aStream := TMemoryStream.Create();
ShowMessage( ParamStr(0) );
if LoadFromFile( ParamStr(0), aStream ) then // PathDir+"\Player2.exe"
begin
Pad.Lines.LoadFromStream( aStream );
end
else
begin
if dlgOpen.Execute() then
begin
if ExtractFileExt( dlgOpen.FileName ) = ".txt" then
begin
if dlgSave.Execute() then
begin
if ExtractFileExt( dlgSave.FileName ) <> ".exe" then
dlgSave.FileName := dlgSave.FileName+".exe";
CopyFile( PChar( ParamStr(0) ), PChar( dlgSave.FileName ), true );
aStream.LoadFromFile( dlgOpen.FileName );
AttachToFile( dlgSave.FileName, aStream );
end
else
begin
ShowMessage( "Íå óêàçàí ôàéë äëÿ ñîõðàíåíè÷." );
end;
end
else
begin
ShowMessage( "Íå âåðíûé òèï ôàéëà." );
end;
end
else
ShowMessage( "Ôàéë äëÿ èìïîðòà âûáðàí íå áûë." );
Application.Terminate();
end;
end;
end.
← →
Anatoly Podgoretsky © (2004-08-04 17:04) [5]Файл занят и открыть на запись не получится.
И кончай умничать, код для того и просили, что бы уувидеть где у тебя ошибка.
Страницы: 1 вся ветка
Текущий архив: 2004.08.22;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.022 c