Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заставить приложение читать себя как обычный файл? [D7, Win95/98, Win2k, WinXP]


П7 ©   (2004-08-04 16:48:00) 

Товарищи!
Нужно открыть прогой себя же используя TFileStream. При попытке собственно открыть вылезает диалог с ошибкой, мол этот файл занят другим процессом. Единственный способ, который я вжу, это в реальном времени сделать копию (CopyFile пофиг, что файл запущен на выполнение) проги в temp, прочитать его и затем стереть. Но это как-то в корне не правильно. Есть ли иной способ прочитать файл?


Anatoly Podgoretsky   (2004-08-04 17:04:00) [1]

Файл занят и открыть на запись не получится.
И кончай умничать, код для того и просили, что бы уувидеть где у тебя ошибка.


П7   (2004-08-04 17:00:00) [2]

Ты сам пробовал? Или просто предполагаешь?
Ладно, может так действительно дело быстрее пойдёт. Вот код, если не трудно, подскажите, пожалуйста, ответ на мой вопрос:

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.


П7   (2004-08-04 16:59:00) [3]


> Anatoly Podgoretsky ©   (04.08.04 16:52) [1]

Кончай умничать - тебе не идёт. Если этим своим постом, ты показываешь мне, что мол без кода я тебе нифига не подскажу, то это показывает, что ты не знаешь, как прочитать файл используя TFileStream. Значит ты мне не поможешь. Тут ведь я не ищю ошибку у себя, как ты видимо предполагаешь. Я ищу способ чтения файла, который мне пока не известен. Понимаешь разницу? Читайте, пожалуйста, внимательней, чтобы не постить затем вот такие вот глупые неадекватные посты, типа [1].


Smithson   (2004-08-04 16:58:00) [4]

Открыть файл с правами Только-на-чтение


Anatoly Podgoretsky   (2004-08-04 16:52:00) [5]

Ошибка в 17 строке


Наверх

Титульная страница Поиск, карта сайта Написать письмо