Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2009, 15:48   #11
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Скорее всего ты прав ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 26.01.2009, 16:42   #12
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

попробуй скопировать файл и от туда прочесть
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 26.01.2009, 19:37   #13
pautina
Пользователь
 
Регистрация: 23.01.2009
Сообщений: 32
По умолчанию

Может как то это можно сделать. Ситуация у меня сейчас такая, программа generatоr.exe создаёт файл лога logfile.txt этот файл постоянно заполняется данными, программа которая у меня написана позволяет вывести нужные мне данные,
Участок кода программы такой
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
    filename='C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt';
var SourceST,DestST:TStringList;
    i:integer; handle:integer;
    s:string;
begin
 SourceST:=TStringList.Create;
 DestST:=TStringList.Create;
 if form1.OpenDialog1.Execute then SourceST.LoadFromFile(form1.OpenDialog1.FileName);

 // FileSetAttr('C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt', faReadOnly);  // Àòðèáóòû äëÿ ôàéëà òîëüêî ÷òåíèå
 Handle := FileOpen('C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt', fmOpenRead );

 for i:=0 to SourceST.Count-1 do
 begin

  try
    // Âûâîä âðåìåííûõ ìåòîê
    if pos(':',SourceST[i])<>0 then // Åñëè ñòðîêà ñ : íàéäåíà
    SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-19,20)
    else
    // Âûâîä ÷èñåë
     if ((pos('|',SourceST[i])<>0) and ((pos('1',SourceST[i])<>0)
         or (pos('2',SourceST[i])<>0) or (pos('3',SourceST[i])<>0)
         or (pos('4',SourceST[i])<>0) or (pos('5',SourceST[i])<>0)
         or (pos('6',SourceST[i])<>0) or (pos('7',SourceST[i])<>0)
         or (pos('8',SourceST[i])<>0) or (pos('9',SourceST[i])<>0)
         or (pos('0',SourceST[i])<>0)))
     then // Åñëè ñòðîêà ñ ðàçäåëèòåëåì | íàéäåíà è â ñòðîêå åñòü öûôðû
     SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
    // Åñëè íè âðåìåííûõ ìåòîê íè ÷èñåë íåò òî ñòðîêà ïóñòàÿ
    else SourceST[i]:='';
    DestST.Add(SourceST[i]);
  except
  end;

 end;
 DestST.SaveToFile('112.txt'); //   DestST.SaveToFile('112.xls');
 SourceST.Free;
 DestST.Free;
end;

end.
Но эта программа не может считать данные с файла logfile.txt когда запущен генератор, выдается сообщение что файл занят другим процессом.
Как мне сделать чтобы я мог считать данные с logfile.txt при работающем генраторе
pautina вне форума Ответить с цитированием
Старый 26.01.2009, 20:32   #14
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

не такое это простое дело - работа с занятыми файлами:

http://wasm.ru/article.php?article=lockfileswork
Д'якон вне форума Ответить с цитированием
Старый 27.01.2009, 09:45   #15
pautina
Пользователь
 
Регистрация: 23.01.2009
Сообщений: 32
По умолчанию

Можно ли как то открыть занятый файл logfile.txt (занят приложением generator.exe) используя TFileStream, что добавить в код
Код:
procedure TForm1.Button1Click(Sender: TObject);

var SourceST,DestST:TStringList;
    i:integer; handle:integer;
    FS: TFileStream;

    s:string;
begin
 SourceST:=TStringList.Create;
 DestST:=TStringList.Create;
 if form1.OpenDialog1.Execute then SourceST.LoadFromFile(form1.OpenDialog1.FileName);

 // FileSetAttr('C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt', faReadOnly);  // Àòðèáóòû äëÿ ôàéëà òîëüêî ÷òåíèå
  Handle := FileOpen('C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt', fmOpenRead );
  FS:= TFileStream.Create('C:\Documents and Settings\ñåðãåé\Ðàáî÷èé ñòîë\Çàäàíèå\logfile.txt', fmShareDenyNone);

 for i:=0 to SourceST.Count-1 do
 begin

 // try     // Âûâîä ÷èñåë
 //   if pos('|',SourceST[i])<>0 then // Åñëè ñòðîêà ñ ðàçäåëèòåëåì | íàéäåíà
 //   SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
 //   else SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,1); // Åñëè ñòðîêà ñ ðàçäåëèòåëåì íå íàéäåíà òî ñòðîêà ñîñòîèò èç ïðîáåëà
 //   DestST.Add(SourceST[i]);   // Âûâîä ÷èñåë

 // except
 // end;

  try
    // Âûâîä âðåìåííûõ ìåòîê
    if pos(':',SourceST[i])<>0 then // Åñëè ñòðîêà ñ : íàéäåíà
    SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-19,20)
    else
    // Âûâîä ÷èñåë
     if ((pos('|',SourceST[i])<>0) and ((pos('1',SourceST[i])<>0)
         or (pos('2',SourceST[i])<>0) or (pos('3',SourceST[i])<>0)
         or (pos('4',SourceST[i])<>0) or (pos('5',SourceST[i])<>0)
         or (pos('6',SourceST[i])<>0) or (pos('7',SourceST[i])<>0)
         or (pos('8',SourceST[i])<>0) or (pos('9',SourceST[i])<>0)
         or (pos('0',SourceST[i])<>0)))

     then // Åñëè ñòðîêà ñ ðàçäåëèòåëåì | íàéäåíà è â ñòðîêå åñòü öûôðû
     SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
    // Åñëè íè âðåìåííûõ ìåòîê íè ÷èñåë íåò òî ñòðîêà ïóñòàÿ
    else SourceST[i]:='';
    DestST.Add(SourceST[i]);
  except
  end;

 end;
 DestST.SaveToFile('112.txt'); //   DestST.SaveToFile('112.xls');
 SourceST.Free;
 DestST.Free;
end;
pautina вне форума Ответить с цитированием
Старый 27.01.2009, 13:41   #16
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Ты наверное хотел уточнить конкретно про fmShareDenyNone атрибут ? Тогда ответ - да !
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 27.01.2009, 14:00   #17
pautina
Пользователь
 
Регистрация: 23.01.2009
Сообщений: 32
По умолчанию

Как мне изменить мой код чтоб всё работало, и не выводилось сообщение что файл занят другим процессом.
Вот код
Код:
procedure TForm1.Button1Click(Sender: TObject);

var SourceST,DestST:TStringList;
    i:integer; handle:integer;
    FS: TFileStream;
   // FileStreamLog:TFileStream;

    s:string;
begin
 SourceST:=TStringList.Create;
 DestST:=TStringList.Create;
 if form1.OpenDialog1.Execute then SourceST.LoadFromFile(form1.OpenDialog1.FileName);

 // FileSetAttr('C:\Documents and Settings\сергей\Рабочий стол\Задание\logfile.txt', faReadOnly);  // Атрибуты для файла только чтение
 // Handle := FileOpen('C:\Documents and Settings\сергей\Рабочий стол\Задание\logfile.txt', fmOpenRead );
  FS:= TFileStream.Create('C:\Documents and Settings\сергей\Рабочий стол\Задание\logfile.txt', fmOpenRead or fmShareDenyNone );
 //  FileStreamLog:=TFileStream.Create('logfile.txt', fmOpenRead or fmShareDenyNone);

 for i:=0 to SourceST.Count-1 do
 begin

 // try     // Вывод чисел
 //   if pos('|',SourceST[i])<>0 then // Если строка с разделителем | найдена
 //   SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
 //   else SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,1); // Если строка с разделителем не найдена то строка состоит из пробела
 //   DestST.Add(SourceST[i]);   // Вывод чисел

 // except
 // end;

  try
    // Вывод временных меток
    if pos(':',SourceST[i])<>0 then // Если строка с : найдена
    SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-19,20)
    else
    // Вывод чисел
     if ((pos('|',SourceST[i])<>0) and ((pos('1',SourceST[i])<>0)
         or (pos('2',SourceST[i])<>0) or (pos('3',SourceST[i])<>0)
         or (pos('4',SourceST[i])<>0) or (pos('5',SourceST[i])<>0)
         or (pos('6',SourceST[i])<>0) or (pos('7',SourceST[i])<>0)
         or (pos('8',SourceST[i])<>0) or (pos('9',SourceST[i])<>0)
         or (pos('0',SourceST[i])<>0)))

     then // Если строка с разделителем | найдена и в строке есть цыфры
     SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
    // Если ни временных меток ни чисел нет то строка пустая
    else SourceST[i]:='';
    DestST.Add(SourceST[i]);
  except
  end;

 end;
 DestST.SaveToFile('112.txt'); //   DestST.SaveToFile('112.xls');
 SourceST.Free;
 DestST.Free;
end;
Код позволяет вывести нужные данные из файла лога logfile.txt (если файл сохранён), Мне нужно добится вывода этих данных при запущенном приложением generator.exe это приложение и создаёт файл лога.

Последний раз редактировалось pautina; 27.01.2009 в 14:38.
pautina вне форума Ответить с цитированием
Старый 27.01.2009, 15:02   #18
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

как вариант :
Код:
var 
  ...
  ...
  FS1, FS2: TFileStream;
  ....
  ....
begin
 SourceST:=TStringList.Create;
 DestST:=TStringList.Create;
 if OpenDialog1.Execute then 
   begin
   // Открываем файл так чтобы к нему пустили 
   FS1:= TFileStream.Create(OpenDialog1.FileName, fmShareDenyNone);
   // Сохраняем во временный файл 
   FS2:= TFileStream.Create('C:\Temp_logfile.txt', fmOpenWrite or fmCreate);
   FS2.CopyFrom (FS1, FS1.Size);
   // Берем содержимое из временного файла
   SourceST.LoadFromFile('C:\Temp_logfile.txt'); 
   // Можно его удалить например
   DeleteFile('C:\Temp_logfile.txt'); 
   ...
   ...
       Тут что-то делаешь с массивом SourceST
   ...
   ...
   SourceST.Free;
   DestST.Free;
   end;
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT

Последний раз редактировалось Kotofff; 27.01.2009 в 15:06.
Kotofff вне форума Ответить с цитированием
Старый 27.01.2009, 17:29   #19
pautina
Пользователь
 
Регистрация: 23.01.2009
Сообщений: 32
По умолчанию

Где то в коде ошибка,
Код:
procedure TForm1.Button1Click(Sender: TObject);

var SourceST,DestST:TStringList;
    i:integer;
    FS1, FS2: TFileStream;
    s:string;
     
begin
 SourceST:=TStringList.Create;
 DestST:=TStringList.Create;
 // if form1.OpenDialog1.Execute then SourceST.LoadFromFile(form1.OpenDialog1.FileName);
 if OpenDialog1.Execute then
  begin
   // Открываем файл так чтобы к нему пустили
   FS1:= TFileStream.Create(OpenDialog1.FileName, fmShareDenyNone);
   // Сохраняем во временный файл
   FS2:= TFileStream.Create('C:\Temp_logfile.txt', fmOpenWrite or fmCreate);
   FS2.CopyFrom (FS1, FS1.Size);
   // Берем содержимое из временного файла
   SourceST.LoadFromFile('C:\Temp_logfile.txt');

 for i:=0 to SourceST.Count-1 do
 begin

  try
    // Вывод временных меток
    if pos(':',SourceST[i])<>0 then // Если строка с : найдена
    SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-19,20)
    else
    // Вывод чисел
     if ((pos('|',SourceST[i])<>0) and ((pos('1',SourceST[i])<>0)
         or (pos('2',SourceST[i])<>0) or (pos('3',SourceST[i])<>0)
         or (pos('4',SourceST[i])<>0) or (pos('5',SourceST[i])<>0)
         or (pos('6',SourceST[i])<>0) or (pos('7',SourceST[i])<>0)
         or (pos('8',SourceST[i])<>0) or (pos('9',SourceST[i])<>0)
         or (pos('0',SourceST[i])<>0)))

     then // Если строка с разделителем | найдена и в строке есть цыфры
     SourceST[i]:=Copy(SourceST[i],Length(SourceST[i])-47,48)
    // Если ни временных меток ни чисел нет то строка пустая
    else SourceST[i]:='';
    DestST.Add(SourceST[i]);
  except
  end;

 end;
 DestST.SaveToFile('112.txt'); //   DestST.SaveToFile('112.xls');
 SourceST.Free;
 DestST.Free;
end;
end;
Сейчас говорит что нет доступа к C:\Temp_logfile.txt

Последний раз редактировалось pautina; 27.01.2009 в 17:33.
pautina вне форума Ответить с цитированием
Старый 27.01.2009, 18:00   #20
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

блин , прости ... после ....
Код:
   // Открываем файл так чтобы к нему пустили
   FS1:= TFileStream.Create(OpenDialog1.FileName, fmShareDenyNone);
   // Сохраняем во временный файл
   FS2:= TFileStream.Create('C:\Temp_logfile.txt', fmOpenWrite or fmCreate);
   FS2.CopyFrom (FS1, FS1.Size);
напиши
Код:
FS1.Free;
FS2.Free;
надо ж освобождать файлы от наших потоков ... после копирования ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод данных из файла в форму. Delphi. NightShade Помощь студентам 8 25.01.2009 10:30
копирование данных в новую таблицу при интерактивном выборе файла gege Microsoft Office Excel 7 22.10.2008 17:16
вывод из файла!!! Exclucive Общие вопросы C/C++ 2 24.05.2008 20:42
Организовать ввод данных с файла созданного в первом задании и вывод их терминал. Saniok Помощь студентам 2 25.10.2007 22:25
Вывод данных BMP файла на форму Vasya Фриланс 18 24.03.2007 00:59