<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Передача данных из Lua-скрипта в другую программу через файл]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=104</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=104&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Передача данных из Lua-скрипта в другую программу через файл».]]></description>
		<lastBuildDate>Sun, 24 Aug 2014 06:55:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Передача данных из Lua-скрипта в другую программу через файл]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=616#p616</link>
			<description><![CDATA[<p>Общий архив с примерами на разных языках можно скачать здесь<br />[url]https://quik2dde.ru/static-img/104/ReadFileFromLua.zip[/url]</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sun, 24 Aug 2014 06:55:25 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=616#p616</guid>
		</item>
		<item>
			<title><![CDATA[Re: Передача данных из Lua-скрипта в другую программу через файл]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=615#p615</link>
			<description><![CDATA[<p>Как сделать чтение такого файла при работающем Lua-скрипте.</p><h5>Delphi</h5><p>Для чтения файла будем использовать объект класса <strong>TFileStream</strong>, в методе <strong>Create</strong> которого последним параметром можно указать тип доступа к файлу. В нашем случае надо указать два модификатора: <strong>fmOpenRead</strong> и <strong>fmShareDenyNone</strong><br />Ниже приведен фрагмент кода, функционально аналогичный тому, что дан в первом посте. Здесь загружается файл в объект типа <strong>TStringList</strong>:</p><div class="codebox"><pre><code>const
    FILE_NAME = &#039;D:\QUIK\Lua\ex_file.txt&#039;;
var
    List: TStringList;
    Stream: TStream;
begin
    if FileExists(FILE_NAME) then
      begin
        List := TStringList.Create;
        try
          Stream := TFileStream.Create(FILE_NAME, fmOpenRead or fmShareDenyNone);
          try
            List.LoadFromStream(Stream);
          finally
            Stream.Free;
          end;
          //
          // ... здесь обработка строк из файла, которые находятся в List ...
          //
          Memo1.Lines.Assign(List);
        finally
          List.Free;
        end;
      end;
end;</code></pre></div><p>В общем архиве со всеми примерами (ссылка в следующем сообщении) приведен пример чтения файла и отображение его содержимого в TMemo в окне программы. Содержимое TMemo постоянно обновляется (используется таймер).<br />Т.к. TMemo имеет готовое свойство Lines типа TStrings, то отдельный экземпляр TStringList не создается, чтение происходит непосредственно в строки TMemo.</p><h5>C#</h5><p>Чтобы иметь возможность указать параметры доступа к файлу, можно использовать один из двух вариантов:</p><div class="codebox"><pre><code>using (Stream fs = new System.IO.FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}</code></pre></div><p>либо</p><div class="codebox"><pre><code>using (Stream fs = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}</code></pre></div><p>После чего используя открытый поток можно читать наш файл.<br />Для построчного чтения текстового можно, например, воспользоваться таким вариантом:</p><div class="codebox"><pre><code>using (StreamReader sr = new StreamReader(fs))
{
    while (!sr.EndOfStream)
    {
        // очередная строка доступна через  sr.ReadLine()
    }
}</code></pre></div><p>В приложенном архиве с примерами (см. следующее сообщение) сделана аналогичная с Delphi программа: периодически по таймеру перечитывается файл и его содержимое отображается в ListBox.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sun, 24 Aug 2014 06:49:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=615#p615</guid>
		</item>
		<item>
			<title><![CDATA[Re: Передача данных из Lua-скрипта в другую программу через файл]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=614#p614</link>
			<description><![CDATA[<p>Для экспериментов сделал такой Lua-файл:</p><div class="codebox"><pre><code>function OnInit()
  out_file = io.open(getScriptPath()..&quot;\\&quot;..&quot;ex_file.txt&quot;,&quot;w&quot;)
  is_run = (out_file ~= nil)
end

function main()
  local i = 0
  while is_run do
    out_file:write(&quot;i=&quot; .. tostring(i) .. &quot;\n&quot;)
    out_file:flush()
    sleep(500)
    i = i + 1
  end
  out_file:close()
end

function OnStop()
  is_run = false
end</code></pre></div><p>Создает в иректории со скриптом файл <strong>ex_file.txt</strong> и пишет в него строки вида<br /></p><div class="codebox"><pre><code>i=0
i=1
i=2</code></pre></div><p>и т.д.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sun, 24 Aug 2014 06:45:19 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=614#p614</guid>
		</item>
		<item>
			<title><![CDATA[Передача данных из Lua-скрипта в другую программу через файл]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=613#p613</link>
			<description><![CDATA[<p>Вопрос был задан на форуме QUIK:</p><div class="quotebox"><blockquote><p>В скрипте lua происходит выгрузка данных в файл:<br />f=io.open(getScriptPath()..&quot;\\Sr\\&quot;..&quot;Treids.txt&quot;,&quot;w&quot;)<br />f:write(&quot;sell&quot;)<br />f:close()<br />При обращении внешнего приложения на Delphi возникает ошибка - &quot;файл занят другим процессом&quot;.<br />Вопрос - есть у кого-нибудь мысли по поводу того почему так происходит?</p></blockquote></div><p>Проблема тут в том, что файл в Lua в данном случае открывается эксклюзивно на запись. Поэтому если в другом процессе читать файл &quot;обычным образом&quot;, то файл, в который идет запись, будет недоступен, &quot;занят другим процессом&quot;.<br />В частности, в данном случае автор вопроса пытался из Delphi читать файл следующим образом:</p><div class="codebox"><pre><code>list:=TStringList.Create;
appdir:= ExtractFileDir(ParamStr(0));
str:=(appdir+&#039;\Files\Rts\Stop.txt&#039;);
list.LoadFromFile(str);
//операции с данными
list.free;</code></pre></div><p>Беда методе list.LoadFromFile(). Если посмотреть его исходники, то видно, что файл открывается просто на чтение, без указания доп. опций &quot;чтения с общим доступом&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sun, 24 Aug 2014 06:27:30 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=613#p613</guid>
		</item>
	</channel>
</rss>
