Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Глобалный поиск наличия файла
DordexДата: Суббота, 11 Апреля 2009, 06:33 | Сообщение # 1
Необукер
Группа: Проверенные
Сообщений: 533
Репутация: 16
Награды: 9
Статус: Offline
FileExist("<?????>\Game.txt","ff")
If (ff = TRUE) Then
LoadText("Text","У вас установлена игра")
Else
LoadText("Text","У вас не установлена игра")
End

Нифига не понимаю, возможно или нет:

Можно ли узнать наличие файла на компе если точно не указывать папку,
а например просто указать диск C:\ smile
хоть даже если файл находится под 10 папками.

Если уже обсуждалось, направьте... smile

 
DEMBELДата: Суббота, 11 Апреля 2009, 08:59 | Сообщение # 2
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
Quote (Омар)
а например просто указать диск C:\ хоть даже если файл находится под 10 папками.

ну для этого же есть команда поиска файлов SearchForFiles, поиск рекурсивный, будет искать в поддиректориях...

Добавлено (11 Апрель 2009, 08:59)
---------------------------------------------
да и плагинов поиска куча




Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
RushДата: Воскресенье, 12 Апреля 2009, 11:18 | Сообщение # 3
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Например, так:
Code

crlf$=CHR(13)+CHR(10)
space$=' '
searchfile$='Game.txt'
Run("cmd","wait,hide /c for /f "tokens=1 delims=\" %i in ('fsutil fsinfo drives ^| more') do (echo %i >> <Temp>\drives.txt)")
drives$=StrFromFile(<Temp>\drives.txt,1,-1)
drives$=StrChange(drives$,crlf$,'')
drives$=StrChange(drives$,space$,'')      
For i=2 To GetArrayNum(drives$,:)
     drive$=GetArrayItem(drives$,:,i)
     searchparam$='wait,hide /c dir "'+drive$+':\\'+searchfile$+'" /a:-d /s | find /i /c "'+searchfile$+'" > <Temp>\check.txt'
     Run("cmd","searchparam$")
     check=VAL(StrFromFile(<Temp>\check.txt,1,1))
     If (check) Then
       LoadText("Text","У вас установлена игра")
       Break()
     End
Next i
If (check=0) Then
     LoadText("Text","У вас не установлена игра")
End
Run("cmd","hide /c del <Temp>\drives.txt; <Temp>\check.txt /q")

Quote (DEMBEL)
ну для этого же есть команда поиска файлов SearchForFiles, поиск рекурсивный, будет искать в поддиректориях

Эта команда ищет только типы файлов. Фиксированное имя ей не под силу...

Добавлено (12 Апрель 2009, 11:18)
---------------------------------------------
Ну ладно, автора вопроса, я смотрю, не заинтересовало решение - попробую подготовить для "ГОТОВЫХ ОТВЕТОВ".
Может кому пригодится... smile
toizy, друже, перекинь, если чего.

Code
crlf$=CHR(13)+CHR(10)
space$=' '
searchfile$='Test.txt'
Run("cmd","wait,hide /c for /f "tokens=1 delims=\" %i in ('fsutil fsinfo drives ^| more') do (echo %i >> <Temp>\drives.txt)")
** Можно использовать другой вариант - с пропуском дисководов, в которых нет дисков
**p$='wait,hide /c @echo off & <System>\mshta.exe "javascript:var f,e,l=\'\';'
**p$=p$+'f=new ActiveXObject(\'scripting.filesystemobject\');e=new Enumerator(f.drives);'
**p$=p$+'for(;!e.atEnd();e.moveNext()){if(e.item().isready)l+=e.item().driveletter+\':\'}'
**p$=p$+'f.getstandardstream(1).write(l);close();" 1 | more > <Temp>\drives.txt'
**Run("cmd","p$")
** Загружаем и обрабатываем массив букв дисков (1-й вариант)
drives$=StrFromFile(<Temp>\drives.txt,1,-1)
drives$=StrChange(drives$,crlf$,'')
drives$=StrChange(drives$,space$,'')
drives$=St   rDel(drives$,1,6)
** При 2-м варианте все действия не нужны, достаточно одного
**drives$=StrFromFile(<Temp>\drives.txt,1,1)
For i=1 To GetArrayNum(drives$,:)
     drive$=GetArrayItem(drives$,:,i)
     searchparam$='wait,hide /c dir "'+drive$+':\\'+searchfile$+'" /a:-d /s | find /i /c "'
     searchparam$=searchparam$+searchfile$+'" > <Temp>\check.txt'
     Run("cmd","searchparam$")
     check=VAL(StrFromFile(<Temp>\check.txt,1,1))
     If (check) Then
       Message("Файл существует","")
       Break()
     End
Next i
If (check=0) Then
     Message("Файл не существует","")
End
Run("cmd","hide /c del <Temp>\drives.txt; <Temp>\check.txt /q")

А теперь пример "Глобального поиска файла" подробно:

1) Создаем необходимые константы, их можно и в скрипт загрузки проекта вставить

crlf$=CHR(13)+CHR(10)
space$=' '

2) Выбираем файл, который нужно найти

searchfile$='Test.txt'

3) Получаем список всех дисков на компьютере в файл

Run("cmd","wait,hide /c for /f "tokens=1 delims=\" %i in ('fsutil fsinfo drives ^| more') do (echo %i >> <Temp>\drives.txt)")
note: можно использовать другой вариант - с пропуском дисководов, в которых нет дисков
p$='wait,hide /c @echo off & <System>\mshta.exe "javascript:var f,e,l=\'\';'
p$=p$+'f=new ActiveXObject(\'scripting.filesystemobject\');e=new Enumerator(f.drives);'
p$=p$+'for(;!e.atEnd();e.moveNext()){if(e.item().isready)l+=e.item().driveletter+\':\'}'
p$=p$+'f.getstandardstream(1).write(l);close();" 1 | more > <Temp>\drives.txt'
Run("cmd","p$")

4) Загружаем и обрабатываем массив букв дисков (1-й вариант)

drives$=StrFromFile(<Temp>\drives.txt,1,-1)
drives$=StrChange(drives$,crlf$,'')
drives$=StrChange(drives$,space$,'')
drives$=StrDel(drives$,1,6)
note: при 2-м варианте все действия не нужны, достаточно одного
drives$=StrFromFile(<Temp>\drives.txt,1,1)

5) Запускаем цикл по проверке всех дисков на наличие файла

For i=1 To GetArrayNum(drives$,:)

6) Получаем букву диска

drive$=GetArrayItem(drives$,:,i)

7) Выполняем проверку полученного диска на наличие файла (операция быстрая)

searchparam$='wait,hide /c dir "'+drive$+':\\'+searchfile$+'" /a:-d /s | find /i /c "'
searchparam$=searchparam$+searchfile$+'" > <Temp>\check.txt'
Run("cmd","searchparam$")

8) Получаем значение (TRUE/FALSE) наличия файла на диске

check=VAL(StrFromFile(<Temp>\check.txt,1,1))

9) Если значение check=TRUE тогда завершаем поиск - файл существует

If (check) Then
Message("Файл существует","")
Break()
End

10) Иначе идет проверка следующего диска

Next i

11) Если в результате обхода всех дисков значение check=FALSE - файла с таким именем нет

If (check=0) Then
Message("Файл не существует","")
End

12) Удаляем временные файлы

Run("cmd","hide /c del <Temp>\drives.txt; <Temp>\check.txt /q")

Сообщение отредактировал Rush - Воскресенье, 12 Апреля 2009, 11:30
 
DEMBELДата: Воскресенье, 12 Апреля 2009, 12:12 | Сообщение # 4
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
вот это я понимаю примерчег...

Добавлено (12 Апрель 2009, 12:12)
---------------------------------------------

Quote (Rush)
p$='wait,hide /c @echo off & <System>\mshta.exe "javascript:var f,e,l=\'\';' p$=p$+'f=new ActiveXObject(\'scripting.filesystemobject\');e=new Enumerator(f.drives);' p$=p$+'for(;!e.atEnd();e.moveNext()){if(e.item().isready)l+=e.item().driveletter+\':\'}' p$=p$+'f.getstandardstream(1).write(l);close();" 1 | more > <Temp>\drives.txt'

Эта фича мне нравится...




Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
YURIYДата: Воскресенье, 12 Апреля 2009, 13:40 | Сообщение # 5
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
Quote (Rush)
toizy, друже, перекинь, если чего.

Перекинул. Спасибо за пополнение раздела отличным решением! smile



Вечная память Андрею Сергееву!
 
DordexДата: Воскресенье, 12 Апреля 2009, 21:05 | Сообщение # 6
Необукер
Группа: Проверенные
Сообщений: 533
Репутация: 16
Награды: 9
Статус: Offline
Rush, нет ну почему же не заинтересовался, если было бы безразлично я и не спрашивал бы ;)

Огромное спасибо! Буду разбирать %) :D слишком много просто получилось!

 
  • Страница 1 из 1
  • 1
Поиск: