Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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( "&#205;&#229; &#243;&#234;&#224;&#231;&#224;&#237; &#244;&#224;&#233;&#235; &#228;&#235;&#255; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#247;." );
       end;
     end
     else
     begin
       ShowMessage( "&#205;&#229; &#226;&#229;&#240;&#237;&#251;&#233; &#242;&#232;&#239; &#244;&#224;&#233;&#235;&#224;." );
     end;
   end
   else
     ShowMessage( "&#212;&#224;&#233;&#235; &#228;&#235;&#255; &#232;&#236;&#239;&#238;&#240;&#242;&#224; &#226;&#251;&#225;&#240;&#224;&#237; &#237;&#229; &#225;&#251;&#235;." );
   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
3-1091013367
don-do
2004-07-28 15:16
2004.08.22
Помогите по коду ошибки получить ее текст из файла Interbas.msg


3-1090543893
sashapont
2004-07-23 04:51
2004.08.22
порядковый номер записей


1-1091775769
doodle
2004-08-06 11:02
2004.08.22
Как создать фаил и поменять дату его создания на месяц назад?


1-1091810693
Lamak
2004-08-06 20:44
2004.08.22
Про RichEdit


14-1091642162
SyncMaster
2004-08-04 21:56
2004.08.22
аля WinHEX