Имя: Пароль:
1C
1C 7.7
v7: быстрый поиск файла когда известны только имя и корневой каталог
,
0 xantimans
 
27.06.13
14:57
Всем привет!
Ситуация следующая: есть очень сильно разветвленное дерево папок, и в этих папках лежат файлы. Нужен быстрый способ поиска файла по корневому каталогу и имени.
1 mulmulya
 
27.06.13
14:59
средствами v7.7?
2 Ковычки
 
27.06.13
15:01
dir /s корень\файл
3 xantimans
 
27.06.13
15:01
(1) средствами 7.7 быстро врятли получится, нужно чтото иное, возможно WMI, но мне его юзать не приходилось еще пока поэтому не уверен
4 xantimans
 
27.06.13
15:20
(2) это не быстрый способ, виндовозный поиск работает быстрее чем dir
5 ДенисЧ
 
27.06.13
15:23
(4) виндовский поиск индекс использует
6 xantimans
 
27.06.13
15:32
(5)молодец, садись 5.
По проблеме может кто помочь, делал кто-то подобное и если делал то с помощью чего?
7 HeroShima
 
27.06.13
15:35
(0) и как часто предполагается проводить такую операцию, что она упирается в скорость?
8 oslokot
 
27.06.13
15:50
(0) загнать его в ТЗ
9 fmrlex
 
27.06.13
15:56
(6) А что тебе не нравится? Хочешь скорости - индексируй.
10 serpentt
 
27.06.13
16:01
СписокXMLФайл.УдалитьВсе();
   
   FSO    = СоздатьОбъект("Scripting.FileSystemObject");
   ScrCtr = СоздатьОбъект("MSScriptControl.ScriptControl");
   ScrCtr.language = "javascript";
   
   Плохо = 0;
   Попытка
       Folder = FSO.GetFolder(НачалоПути+Строка(НомерМаршрута)+СерединаПути);
   Исключение
       Сообщить("Проблема с файлами... "+ОписаниеОшибки());
       Плохо = 1;
   КонецПопытки;
   Если Плохо = 1 Тогда
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
   
   ScrCtr.AddObject("Подпапки",Folder.SubFolders);
   Подпапки=ScrCtr.Eval("new Enumerator(Подпапки)");
   Пока Подпапки.atEnd(0)=0 Цикл
       ИмяКаталога = Подпапки.item(0).Name;
       
       Если Лев(ИмяКаталога,12) = ОкончаниеПути+Формат(ДатаМаршрута,"Д ГГГГММДД") Тогда
           //Сообщить("Папка = " + ИмяКаталога);
           ВремИмяФайла = НачалоПути+Строка(НомерМаршрута)+СерединаПути+ИмяКаталога+"\"+ШаблонИмени;
           Если FSO.FileExists(ВремИмяФайла)<>0 Тогда
               СписокXMLФайл.ДобавитьЗначение(ВремИмяФайла);
           КонецЕсли;
       КонецЕсли;
       
       Подпапки.moveNext(0);
   КонецЦикла;
11 Ковычки
 
27.06.13
16:03
(10) чем это быстрее ФС.НайтиФайл ? и где рекурсия ?
12 fmrlex
 
27.06.13
16:05
13 serpentt
 
27.06.13
16:07
(11) я привел пример, а не готовое решение
т.е. задал "вектор"
14 Ковычки
 
27.06.13
16:08
(13) чем это отличается от ФС.НайтиФайл ?
15 serpentt
 
27.06.13
16:10
(14) ИМХО работает быстрее
16 xantimans
 
28.06.13
17:52
(10) покурил разные статейки в интернете и где-то вычитал что при поиске файлов, если налагаются условия доп условия, то WMI отрабатывает быстрее чем FSO, посему написал такую белеберду:
               ScrCrl = СоздатьОбъект("MSScriptControl.ScriptControl");

               ScrCrl.Language = "javascript";

               Locator = СоздатьОбъект("WbemScripting.SWbemLocator");

               Service = Locator.ConnectServer();

               Service.Security_.ImpersonationLevel=3;

               NP = Service.ExecQuery("

               |SELECT Name

               |FROM CIM_DataFile

               |WHERE Drive = 'Q:' AND Path LIKE '\\%' AND FileName = '"+СокрЛП(ИмяФайла)+"'");

               ScrCrl.AddObject("NP",NP);

               NP = ScrCrl.Eval("new Enumerator (NP)");          

               Пока NP.atEnd(0) = 0 Цикл

                               Сообщить(NP.item(0).name);

                               NP.moveNext(0);

               КонецЦикла;
Но все равно ищет медленно, может кто подскажет как ускорить??
17 Ковычки
 
28.06.13
17:56
(16) не быстрее
18 Ковычки
 
28.06.13
17:57
особо лайк в свете сабжа радует
19 xantimans
 
28.06.13
18:05
(18) а как тут без лайка, вообщем народ я уже 2-ой день голову себе ломаю в одиночестве, посоветоваться не с кем, так что выручайте
20 Посмотрим
 
28.06.13
18:22
Файлы в каталог пишешь из 1ски или сторонние программы
21 Ковычки
 
28.06.13
18:24
Drive = 'Q:' AND FileName = '"+СокрЛП(ИмяФайла)+"'"
22 Ковычки
 
28.06.13
18:29
вернее как то так

Точка=Найти(ИмяФайла,".");
Имя=Лев(ИмяФайла,Точка-1);
Расширение=Прав(ИмяФайла,Точка+1);
...
Drive = 'Q:' AND FileName = '"+Имя+"' and extension='"+Расширение+"'"
23 Ковычки
 
28.06.13
18:45
ну или как то вернее найти последнюю точку, т.е. имя и расширение
24 xantimans
 
28.06.13
18:51
(20) нет не пишу их, это сканы оригиналов доков, я хочу их прицепить к докам базы
(22) в таком случае он будет искать только в корне, а мне нужен поиск во всем дереве каталогов(дерево состоит из 2500 папок и 9000+ файлов), и расширение файла не известно, это может быть .jpg, .pdf или tiff
25 HeroShima
 
28.06.13
18:53
(24) тебя вопрос в (7) ни на какие мысли не натолкнул?
26 xantimans
 
28.06.13
19:10
(25)натолкнул, но к примеру надо в налоговую отправить 500 сканов ориганалов доков, и поиск тогда займет больше 4 часов
27 HeroShima
 
28.06.13
19:16
(26) Реорганизуй хранилище так, чтобы ничего не нужно было искать - на это он должен был на толкнуть. То есть нормальная структура хранения с сохранением в 1С относительного пути к каждому изображению. Или вообще БД.
28 Ковычки
 
28.06.13
19:39
(24) Вы это кому сказали ?
29 xantimans
 
01.07.13
09:54
(27) понятно что все будет реорганизовано, меня интересует именно быстрый поиск
(28) -> (0)
30 Ковычки
 
01.07.13
13:28
(29) хреново Вы понимаете, см внимательно (22)
31 xantimans
 
01.07.13
15:20
(30) разницы по времени никакой, а так да невнимателен, спасибо
32 Злой Бобр
 
01.07.13
16:36
На самом деле вам нада упорядочить каталог. За дерево с 2к папок нада руки в двери ставить. Тогда и вопрос поиска решится сам собой.
33 xantimans
 
01.07.13
16:56
(32)реструктуризацию проведу, в этом мне кстати и поможет мой поиск. Просто хотелось найти самый быстрый вариант поиска(изучать все технологии нет времени, потому и спрашивал мало ли есть кто опытный).
При одинаковых условиях:
- обычный виндовозный поиск справляется за чуть больше чем 20 сек (но не знаю по какому принципу он работает и как его к 1С прикрутить)
- WMI запрос и команда DIR примерно за 40 сек
- FSO через обзор папок с рекурсией самый медленный
34 uno-group
 
01.07.13
16:57
в документ разово запихай путь к его сканкопии и забуть про скорость поиска. наверника есть какаято структура этого каталога и можно искать не во всех нацати папках а только в малой их части
35 uno-group
 
01.07.13
16:59
можеш сделать маленькую базку в которую запихать все папки и имена и ее в 1 индекснуть оброботать как надо
36 Ёпрст
 
01.07.13
16:59
(33) а через ФС.НайтиПервыйФайл засекал ?
:)
37 uno-group
 
01.07.13
17:03
скопировать директорию и выкинуть оброботкой все файлы в корень этой дириктори.
38 xantimans
 
01.07.13
17:22
(36) через ФС не смог реализовать, атрибутыФайла() не возвращает имя каталога (((, не знаю почему, платформа наверное глючит
39 HeroShima
 
01.07.13
17:24
(33) для реструктуризации поиск абсолютно не нужен
40 Jaap Vduul
 
01.07.13
17:25
>> обычный виндовозный поиск
Какая версия windows?
Обычный не должен сильно отличаться от того же dir.
А вот если windows search задействован, то да (но из коробки он только в младших версиях windows включён).
41 xantimans
 
01.07.13
17:26
(40) server 2003, конечно я search имел ввиду
42 xantimans
 
01.07.13
17:28
(39)ну не руками же структурировать, а так заложу нормальную  структуру дерева в обработку и распихаю по ней файлы
43 Jaap Vduul
 
01.07.13
17:34
(41)
На 2003 search отдельно ставится
44 Chai Nic
 
01.07.13
17:41
Помнится, в свое время в роадмапе висты была идея о встраивании службы индексирования и поиска напрямую в NTFS. Чтобы файлы можно было выбирать sql-запросами.. Что-то не взлетело :(
45 xantimans
 
01.07.13
17:46
(44) чем тебе в (16) не SQL запрос
46 Jaap Vduul
 
01.07.13
17:47
(44)
Не напрямую в NTFS, конечно:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff684395(v=vs.85).aspx
47 Chai Nic
 
01.07.13
22:26
(46) Изначально речь шла именно о встроенной в ntfs поддержке индексирования, а не о дополнительной службе поверх ФС. А вообще, идея неплохая была.. Реляционная надстройка поверх иерархической ФС для быстрого доступа, с сохранением возможности иерархического доступа, но без обязательного требования иерархичности. Грубо говоря, предполагалось, что файл сохранялся "куда-то на диск", а ключом к открытию файла становился не иерархический путь, а набор критериев базы данных, то есть, условие WHERE в sql-запросе, по сути. В качестве критериев могли выступать как имя файла (в том числе и пословно со склонениями), так и ключевые слова содержимого, метаданные и т.п. - через соответствующие библиотеки парсинга. При сохранении файла на ФС его индексирование происходило сразу же, а не по расписанию.