<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: поиск файла]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=2015</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2015&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: поиск файла».]]></description>
		<lastBuildDate>Sun, 27 Jul 2008 20:44:32 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBScript: поиск файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=12920#p12920</link>
			<description><![CDATA[<p>Поиск файла (в приведённом примере поиск ведётся только на томах локальных несъёмных дисков, однако это легко может быть модифицировано).<br /></p><div class="codebox"><pre><code>Option Explicit


Dim objFSO
Dim objDrive
Dim strFileNameForFind
Dim i
ReDim arrPaths(0)                                                    &#039; Динамический массив для найденных путей


strFileNameForFind = &quot;test.txt&quot;                                      &#039; Имя файла для поиска.

Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)

arrPaths(LBound(arrPaths)) = False                                   &#039; Первый элемент массива - флаг результата поиска.

For Each objDrive In objFSO.Drives                                   &#039; Перебираем все существующие тома.
    If objDrive.DriveType = 2 Then                                   &#039; Том фиксированный?
        If objDrive.IsReady Then                                     &#039; Том готов?
            WScript.Echo &quot;Find on drive &quot; &amp; objDrive.DriveLetter &amp; &quot;:...&quot;
            
            FindInSubFolders objDrive.RootFolder, strFileNameForFind &#039; Вызываем процедуру поиска
                                                                     &#039; для корневой папки этого тома.
                                                                     &#039; Обработка вложенных папок будет
                                                                     &#039; вестись рекурсивно.
        End If
    End If
Next

If arrPaths(LBound(arrPaths)) Then                                   &#039; Файл(ы) был(и) найден(ы)?
    WScript.Echo
    WScript.Echo &quot;Found paths for file [&quot; &amp; strFileNameForFind &amp; &quot;]:&quot;
    WScript.Echo &quot;------------------------------------------------------------&quot;
    
    For i = LBound(arrPaths) + 1 To UBound(arrPaths)                 &#039; Выводим все найденные пути.
        WScript.Echo arrPaths(i)
    Next
    
    WScript.Echo &quot;------------------------------------------------------------&quot;
Else
    WScript.Echo &quot;Not found paths for file [&quot; &amp; strFileNameForFind &amp; &quot;].&quot;
End If

Set objFSO = Nothing

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
Sub FindInSubFolders(objFolder, strFileName)
    Dim objSubFolder
    Dim strFullFileName
    
    WScript.Echo objFolder.Path                                      &#039; Выводим путь обрабатываемой папки (для
                                                                     &#039; отладки; имеет смысл закомментировать).
    
    strFullFileName = objFSO.BuildPath(objFolder, strFileName)       &#039; Строим полный путь файла.
    
    If objFSO.FileExists(strFullFileName) Then                       &#039; Файл существует?
        ReDim Preserve arrPaths(Ubound(arrPaths) + 1)                &#039; Увеличиваем размер массива.
        arrPaths(LBound(arrPaths)) = True                            &#039; Устанавливаем флаг результата поиска.
        arrPaths(UBound(arrPaths)) = strFullFileName                 &#039; Запоминаем путь.
        
        WScript.Echo &quot;Found file [&quot; &amp; strFileName &amp; &quot;] in folder [&quot; &amp; objFolder.Path &amp; &quot;].&quot;
    End If
        
    On Error Resume Next                                             &#039; Обрабатываем ошибки, возможные в случае,
                                                                     &#039; когда нет доступа к содержимому папки
                                                                     &#039; (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       &#039; Удалось получить доступ к содержимому папки?
            On Error Goto 0                                          &#039; Восстанавливаем стандартную обработку ошибок
            FindInSubFolders objSubFolder, strFileName               &#039; Вызываем процедуру поиска для каждой из подпапок.
        Else                                                         &#039; Если не удалось —
            Err.Clear                                                &#039; сбрасываем состояние ошибки,
            On Error Goto 0                                          &#039; восстанавливаем стандартную обработку ошибок и движемся дальше.
            WScript.Echo &quot;Can&#039;t enumerate subfolders for folder [&quot; &amp; objFolder.Path &amp; &quot;].&quot;
        End If
    Next
End Sub
&#039;=============================================================================</code></pre></div><p>Идея использования метода .FileExists() вместо перебора коллекции .Files была почерпнута в процессе обсуждения на форуме, непосредственно из <a href="http://forum.script-coding.com/viewtopic.php?pid=7754#p7754">поста</a> коллеги <strong>Xameleon</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 27 Jul 2008 20:44:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=12920#p12920</guid>
		</item>
	</channel>
</rss>
