<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=975&amp;type=atom" />
	<updated>2007-12-19T18:36:03Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=975</id>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7228#p7228" />
			<content type="html"><![CDATA[<p>Судя по описаниям из открытых источников (NirSoft, Sysinternals &amp; etc), как происходит процесс поиска открытых файлов — напрямую вряд ли получится. Самый простой вариант — использовать консольный <a href="http://technet.microsoft.com/ru-ru/sysinternals/bb896655(en-us).aspx">Handle</a> и разбирать его вывод, дабы получить PID процесса. Пример работы Handle:<br /></p><div class="quotebox"><blockquote><p>C:\ShellExecute Demonstration&gt;<br />. &quot;C:\Install\Sysinternals.com\Handle\Handle 3.30\handle.exe&quot; Sample.xls</p><p>Handle v3.3<br />Copyright (C) 1997-2007 Mark Russinovich<br />Sysinternals - www.sysinternals.com</p><p>EXCEL.EXE&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pid: <strong>3612</strong>&nbsp; &nbsp; 290: C:\ShellExecute Demonstration\Sample.xls</p><br /><p>C:\ShellExecute Demonstration&gt;<br />.</p></blockquote></div><p>P.S. По поводу же неблокированных файлов YMP уже правильно сказал. Общего метода решения не существует. Для каждого приложения нужен будет свой метод.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2007-12-19T18:36:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7228#p7228</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7224#p7224" />
			<content type="html"><![CDATA[<p>Вам нужно узнать, каким процессом/приложением открыт и заблокирован файл?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2007-12-19T17:51:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7224#p7224</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7222#p7222" />
			<content type="html"><![CDATA[<p>Что это за страусиная политика? Так скоро смотреть некуда станет. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Думаю, не &quot;может быть&quot;, а обычное дело. Сейчас я это пишу в текстовом редакторе, где загружено 95 файлов. Все они открывались только для считывания содержимого и тут же закрывались. Знаю точно, т.к. сам его и написал. Зачем держать их открытыми-то, какой смысл? И Блокнот, думаю, тоже именно так и работает. Например, &quot;открытый&quot; им файл удаляется без шума и пыли. Тогда как если файл на самом деле открыт каким-то процессом, получаем вот что:<br /></p><div class="quotebox"><blockquote><p>---------------------------<br />Ошибка при удалении файла или папки<br />---------------------------<br />Не удается удалить test. Объект используется другим пользователем или программой.</p><p>Закройте все программы, которые могут использовать этот файл и повторите попытку.<br />---------------------------<br />ОК&nbsp; &nbsp;<br />---------------------------</p></blockquote></div><p>Т.е. файл <strong>используется</strong> очень короткое время, пока считывается. После этого используется его копия в памяти. А файл уже закрыт и <strong>не</strong> используется.</p><p>Но это всё так, мысли вокруг да около. WMI для меня тёмный лес, кто его знает, может, там есть волшебный приём на этот случай. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Хотя знатоки его пока хранят загадочное молчание.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2007-12-19T16:54:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7222#p7222</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7218#p7218" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Что-то я вообще сомневаюсь в 100%. Приложение может открыть файл, считать его в буфер и закрыть. В результате файл даже и не открыт, хотя &quot;используется&quot;, т.к. его содержимое отображается в окне. Этот-то случай как определить? Даже в заголовке окна скорее всего не полное имя файла будет. Залезать в память процесса и шарить там в поисках пути отображаемого файла? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>Конечно, такой случай может быть, однако давайте не будем его рассматривать. <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Large Null]]></name>
			</author>
			<updated>2007-12-19T12:42:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7218#p7218</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7217#p7217" />
			<content type="html"><![CDATA[<p><img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Large Null]]></name>
			</author>
			<updated>2007-12-19T12:39:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7217#p7217</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7216#p7216" />
			<content type="html"><![CDATA[<p>Что-то я вообще сомневаюсь в 100%. Приложение может открыть файл, считать его в буфер и закрыть. В результате файл даже и не открыт, хотя &quot;используется&quot;, т.к. его содержимое отображается в окне. Этот-то случай как определить? Даже в заголовке окна скорее всего не полное имя файла будет. Залезать в память процесса и шарить там в поисках пути отображаемого файла? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2007-12-19T11:58:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7216#p7216</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[JScript: Идентификатор процесса (процессов), открывшего файл]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=7215#p7215" />
			<content type="html"><![CDATA[<p>Добрый день, Уважаемые гуру!</p><p>Буду рад если Вы подскажете идею решения следующей задачи:</p><p>Дано: Полное имя файла.<br />Надо: Определить список процессов открывших данный файл.</p><p>Подробнее: Необходимо запустить программу ассоциированную с данным файлом.<br />Сделать это достаточно просто:<br /></p><div class="codebox"><pre><code>   oWshShell.Run(&#039;&quot;&#039; + sFileFullName + &#039;&quot;&#039;,  1)</code></pre></div><p>Однако если с файлом ассоциировано &quot;не хитрое&quot; приложение (не такое как Word или Excel, а например Notepad), то будет открыто ровно столько приложений, сколько запусков файла вы осуществили. А вот именно этого и хотелось бы избежать. А именно: посмотреть если файл уже используется каким либо процессом, то получить Id процесса и активизировать его вызовом<br /></p><div class="codebox"><pre><code>  oWshShell.AppActivate( nProcessId );</code></pre></div><p>Косвенное решение данной проблемы я имею. Суть идеи состоит в том, чтобы анализировать командную строку запуска процесса, с выявлением - передан ли файл в качестве аргумента командной строки. Если имя файла есть в аргументах командной строки, то можно с большой уверенностью сказать, что данный файл используется процессом приложения. Однако уверенность не 100 процентная. Ниже код скрипта для описанного анализа:</p><div class="codebox"><pre><code>//
//  Поиск процесса 
//
function Lib_SysDoc_FindSysDocProcessId( sFileFullName )
{
 var oWMIService, oProcItems, oEnumItems, nProcessId;

   nProcessId = 0;
   try
   {
     oWMIService = GetObject(&quot;winmgmts:\\\\.\\root\\CIMV2&quot;);
     oProcItems = oWMIService.ExecQuery(&quot;SELECT * FROM Win32_Process WHERE name LIKE &#039;%.exe%&#039; OR name LIKE &#039;%.com%&#039;&quot;, &#039;WQL&#039;);
     
     // Ишем ProcessId  
     oEnumItems = new Enumerator(oProcItems);
     for (; !oEnumItems.atEnd(); oEnumItems.moveNext()) 
     {
       with ( oEnumItems.item() )
       {
         if ( CommandLine == null )
           continue;
         if ( CommandLine.indexOf( sFileFullName ) &gt;= 0 )
         {
           nProcessId = ProcessId;
           break;
         }
       }
     }
   }
   catch(e)
   {
     nProcessId = 0
   }
   if ( oWMIService != null )
     ReleaseObject(oWMIService);

   return( nProcessId )
}</code></pre></div><p><img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> Повторюсь - Буду признателен если Вы подскажете идею решения изложенной выше задачи.</p>]]></content>
			<author>
				<name><![CDATA[Large Null]]></name>
			</author>
			<updated>2007-12-19T10:32:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=7215#p7215</id>
		</entry>
</feed>
