|
|
|
| Ситуация следующая: Я создал базу данных изделий предприятия. На сервере этого же предприятия есть файлы разработок изделий. Я хочу сделать так, чтобы в форме в списке при нажатии кнопки "Показать изделия" появлялись строки с путями до файлов на сервере и при двойном клике - запускался файл в родном приложении.
Реализация:
На сервере все изделия раасортированы каждое в свою директорию. В базе-же содержится некий набор данных, по которым я смогу приблизительно определить имя директории, но оно будет с продолжением (пояснение). Пример:
В базе строка говорит: zn14-00-000-01
На сервере директория: zn14-00-000-01 Усилитель линейный
МОЯ ПРОБЛЕМА: На сервере ОЧЧЧЕНЬ МНОГО ФАЙЛОВ (директорий только под 700, а в каждой не менее 15 файлов!!(стандартно там куча поддиректорий со своими файлами)). Я написал функцию, которая находит все файлы, начинающиеся с "zn14-00-000-01". НО ФУНКЦИЯ РАБОТАЕТ ОЧЕНЬ ДОООООЛГО! (от 2 до 4 минут).
Подскажите, как мне сначала включить НЕ ПОИСК ФАЙЛОВ, А ПОИСК ПОХОЖЕЙ ДИРЕКТОРИИ, а потом уже в ней я включу как раз эту функцию поиска файлов.
Вот моя ф-ция:
Function A1() As String
A1 = "Файлы не найдены!"
Dim ListRes1 As String
With Application.FileSearch
.LookIn = "\\tyan\arhive\"
.FileName = "zn14-00-000-01"
.SearchSubFolders = True
.Execute SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending
For i = 1 To .FoundFiles.Count
If ListRes1 = "" Then
ListRes1 = .FoundFiles(i)
Else
ListRes1 = ListRes1 & ";" & .FoundFiles(i)
End If
Next i
End With
If Len(ListRes1) > 0 Then A1 = ListRes1
End01:
End Function
Результат работы этой функции строка, которую можно использовать как данные для списка. Что-то вроде (ф-ция кнопки на форме):
me.list1.rowsource=a1
ПОМОГИТЕ КТО МОЖЕТ!!! Я НЕ ЗНАЮ КАК ВКЛЮЧИТЬ ПОИСК ИМЕННО ПАПОК!!
Перепробовал уже все способы. Перерыл интернет. Все пусто. Нет даже намеков.
ПЛИЗЗЗ! | |
|
| |
|
|
|
| сталкивался с подобной проблеммой.
нужно было искать по всем финтам файлы с определенным расиширением, переписывал 3 раза, в итоге сделал на API... вот только найти никак не могу, куда запихнул, если найду - кину
пока могу посоветовать использовать FileSystemObject (тоже довольно быстро работает).
справка по FSO на русском
http://www.arimsoft.ru/msaccess/FileSystemObject.zip | |
|
| |
|
|
|
| Спасибо большое. Буду пробовать на FSO (правда для меня пока это вообще новое что-то).
Если Вы все-таки обнаружите Вашу волшебную функцию- моей радости просто не будет предела! ;-))) | |
|
| |
|
|
|
| писалось 3 года назад.
Перерыл все ... Написал письмо заказчику, может у него осталось... пока молчит
поищите в инете по:
FindFirstFile и FindNextFile | |
|
| |
|
|
|
| Извините, (я не профи) а таблица с директориями не подойдёт...
Это же база данных , вот и создать вам таблицу с полем (ПУТЬ К .....),
значение поля \\Болты\
значение поля \\Винты\
А внутри уже файлы будете искать...
А если подробную табличку состряпать с путями и файлами, то и порядок будет и искать раз плюнуть...
Вот табличку можно автоматом создать, используя то что ВЫ уже написали(код) | |
|
| |
|
|
|
| Уважаемый ЧАС!
Проблема состоит в том, что работает целое предприятие над разработками, и за один день через нормоконтролеров может проходить довольно большой обьем информации. А разработчики на то и нужны, чтобы разрабатывать нечто новое.
Вот и выходит, что информация постоянно меняется, в большинстве своем чаще добавляются файлы и папки.....
В связи с этим невозможно использовать ваш совет. Спасибо за ваше участие. Буду рад снова наблюдать вас здесь. Пожалуйста, не обижайтесь: Я считаю, что чем больше мыслей- тем ближе к истине. :-)) | |
|
| |
|
|
|
| Я не обижаюся я помогаю .
Так ведь вновь заносимые файлы сразу со своими путями со всех компов заносятся (соэдав програмку из нескольких строк) в эту общедоступную на сервере табличку.
хотел отправить файлик , но....
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND hide = 'show'' at line 2 | |
|
| |
|
|
|
|
'***************************************************************
' Подписка: "Access 2000 - программирование и готовые решения"
' Тема: Application.FileSearch
' Пример 1: Поиск файлов по шаблону
' Версия: 1 от 19.10.2001
' Copyright © Leader Access, Ltd
' Сайт: http://www.leadersoft.ru
' Почта: support@leadersoft.ru
' Примечание: При использовании в коммерческих целях - оплата 100 рублей
'
Option Compare Database
Option Explicit
'==============================================================
' Поиск файлов по шаблону
Private Sub butRead_Click()
Dim i As Long
On Error GoTo 999
With Application.FileSearch
.NewSearch
.LookIn = Me.myFolder ' = c:\
.FileName = Me.myExt ' = *.mdb
.SearchSubFolders = Me.myFflagSubFolder ' = True
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
Me.progress = "Count=" & .FoundFiles.Count & vbCrLf
For i = 1 To .FoundFiles.Count
Me.progress = Me.progress & .FoundFiles(i) & vbCrLf
Next i
End If
End With
Exit Sub 'Выходим из программы
999:
MsgBox Err.Description
Err.Clear 'Очищаем поток от ошибок
End Sub
|
| |
|
| |
|
|
|
| и вот ещё...
'***************************************************************
' Подписка: "Access 2000 - программирование и готовые решения"
' Тема: Работа с внешним бинарным файлом
' Версия: 1 от 02.09.2002
' Автор: Copyright © LeaderAccess, LTD
' Сайт: http://www.leadersoft.ru
' Почта: support@leadersoft.ru
' Примечание: При использовании в коммерческих целях - оплата 100 рублей
'
Option Compare Database
Option Explicit
'==============================================================
' При загрузке формы загружаем файлы
Private Sub Form_Load()
funAutoReadAllFiles Application.CurrentProject.Path, "*.txt"
End Sub
'==============================================================
' Прочитаем имена файлов и загрузим их в таблицу
'
Private Sub funAutoReadAllFiles(strDir As String, strFileExt As String)
Dim i As Long, rst As DAO.Recordset
On Error GoTo 999
With Application.FileSearch
.NewSearch
.LookIn = strDir ' *.name
.FileName = strFileExt ' *.txt
.SearchSubFolders = False
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count
If MsgBox("Загрузить файл: " & .FoundFiles(i), vbInformation + vbOKCancel, "Загрузить") = vbOK Then
funAutoReadOneFile .FoundFiles(i), "Таблица5"
Me.table5.Requery
End If
Next i
End If
End With
Exit Sub 'Выходим из программы
999:
MsgBox Err.Description
Err.Clear 'Очищаем поток от ошибок
End Sub
'==============================================================
' Загружаем файл в таблицу
'
Private Function funAutoReadOneFile(strFileName As String, strTable)
Dim fs, f, flag
Dim dbs As DAO.Database, rst As DAO.Recordset
On Error GoTo 999
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(strFileName)
' Проверка файла
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("select * from " & strTable)
If rst.RecordCount Then
rst.MoveLast
rst.MoveFirst
End If
rst.FindFirst "[FileName] = '" & strFileName & "'"
If rst.NoMatch = False Then
dbs.Close
rst.Close
Exit Function
End If
' Добавление информации о дате создания
rst.AddNew
rst!FileName = strFileName
rst!DateCreated = f.DateCreated
' Добавление информации о содержимом
rst!Memo = ""
Set f = fs.OpenTextFile(strFileName, 1, False)
Do While f.AtEndOfStream <> True
rst!Memo = rst!Memo & f.ReadLine ' Читаем построчно
Loop
f.Close
' Сохранение содержимого
rst.Update
rst.Close
dbs.Close
Exit Function
999:
Ошибка:
MsgBox Err.Description
Err.Clear
rst.Close
End Function
|
| |
|
| |
|
|
|
| А чего Вы своё "Е-мель" не напишите? ..... | |
|
| |
|
|
|
| >А чего Вы своё "Е-мель" не напишите? .....
Уже исправился..
Уважаемый ЧАС!
Если честно, то я не понял смысл вашей фразы:
"...Так ведь вновь заносимые файлы сразу со своими путями со всех компов заносятся (соэдав програмку из нескольких строк) в эту общедоступную на сервере табличку..."
Как мне думается, вы хотели сказать, чтобы люди из отдела Документации при выкладывании файлов также регистрировали их и в базе?
Если я правильно понял суть, то хочу вновь вас разочаровать. С компьютерами на данном предприятии знакомы посредственно (к примеру, мастер участка на производстве в конце месяца собирает данные о работниках (кто сколько отработал) и забивает эти данные в Excel. Далее ИХ РАСПЕЧАТЫВАЕТ НА ПРИНТЕРЕ, НЕСЕТ В ОТДЕЛ ПЕРСОНАЛА И ТАМ ЭТИ ДАННЫЕ ДРУГОЙ ЧЕЛОВЕК ЗАНОСИТ В Excel!!!!!!!!!!!!!!!!! Самое плохое - то, что это ИМЕННО ТАК и обстоит! ). А про мою базу, полагаю, ни кто и не вспомнит даже на второй день!! И заносить данные туда соответственно ни кто не будет (эта база в первую очередь необходима самим разработчикам, а нормоконтролерам, или тем более отделам разным она ни к селу и к месту :-(( )... Тем более такой способ не отображает текущего состояния данных на сервере.
В описанных же вами функциях везде стоит функция Application.FileSearch
Если вы посмотрите, в моем вопросе тоже используется эта ф-ция. Проблема состоит в том, что КОЛИЧЕСТВО ФАЙЛОВ БОЛЬШОЕ и после нажатия кнопки на форме вся система виснет на 2-4 минуты наглухо!! (для примера попробуйте поискать на диске C:\ файлы с символом в имени "a". Вы увидите, что для постоянного пользования эта ф-ция не подходит, а народ хочет ИМЕННО ПОСТОЯННО ЕЕ ЮЗАТЬ (почему я и пытаюсь что-либо сделать).
Зависание происходит после выполения команды ".Execute"
В любом случае- спасибо вам за советы. С нетерпением жду еще. :-)) | |
|
| |
|
|
|
| >>она ни к селу и к месту
воще-то ИМХО и оглядываясь на опыт, тогда ВООБЩЕ нет смысла напрягаться...
ты потратишь кучу времени и сил, а завтра уже твое решение не будет нужно никому...
по application.filesearch - в принципе в таких условиях полная переиндексация системы директорий и файлов - едва ли не единственй возможный способ решения задачи и 2-4 минуты потери времени не проблема - главное куда прикрутить такую переиндексацию.. найди место где все равно есть пустые потери времени...
1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.
2) файлы в директориях сканить ккаждый раз когда юзер обращается к определеной директории - нет нужды делать это каждый раз для всех папок - только для конкретных
блин... там Чичерина по Северо-Запад плюс - побежал смотреть
со старым новым годом всех...
Сегодня http://news.bbc.co.uk/hi/russian/news/newsid_6205000/6205333.stm | |
|
| |
|
|
|
| 1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.
Всегда нужна свежая информация о выложеных файлах?(ежеминутно).
Или их выкладывают только вечером? | |
|
| |
|
|
|
| >Всегда нужна свежая информация о выложеных файлах?(ежеминутно).
>Или их выкладывают только вечером?
Инфу выкладывают в течении всего рабочего дня (народ работает ведь).
################################
2) файлы в директориях сканить ккаждый раз когда юзер обращается к определеной директории - нет нужды делать это каждый раз для всех папок - только для конкретных
согласен. но это ведь база данных, в кторой в свою очередь находится ВСЯ информация. Соответственно не известно, какую именно директорию запросит пользователь. А как я в самом начале сказал, информация из базы НЕ ТОЧНО определяет директорию. Потому и мучаюсь...
#########################
1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.
Согласен, как идея - самое то. Проблема состоит в том, что:
1- вход в базу пока "для всех только для чтения". Только избранные имеют доступ для редактирования. Соответственно при запуске сразу открывается главная форма. Т.К. на предприятии работает более 1000 человек, для каждого выдавать пароль нет смысла. А один для юзеров- тоже проблема, т.к. пользователи НЕ ВСЕ будут знать нужный пароль (пользоваться то должно ВСЁ предприятие). Далее- при индексации скажем раз в день должен быть полный доступ до базы, что тоже исключено. :-((
2- При индексации повисает компьютер (на 2-4мин). Мне же сделан доступ тоже только для чтения (это потому, что данные очень не хочется потерять). Я могу только начальнику принести новую версию и он заменит старую базу на новую. Хотя мне предлагали полный доступ- я сам отказался (если что случится, как вы думаете, кто останется виноватым?).
Всех с Праздником поздравляю! Счастья, радости, успехов пожелаю! Пусть невзгоды и сомненья растворятся на ходу, а здоровье и удача закрепятся с вами!
во как сходу сочинил :-)))
Хочу всех поблагодарить за советы! Решение по немногу прорисовывается. Если есть идеи- рад буду наблюдать их здесь.
Вроде что-то нашел, только у меня не работает- сплошные ошибки выдает. Если есть у кого желание- помогите разобраться с листнгом..
http://vbnet.mvps.org/index.html?code/fileapi/oldestfolder.htm | |
|
| |
|
|
|
| использовать для индексации файловой структуры внешню программу запускаемую на сервере и сбрасывающую данные в лог - текстовый файл например, его и подключать к базе | |
|
| |
|
|
|
| >использовать для индексации файловой структуры внешню
>программу запускаемую на сервере и сбрасывающую данные в лог
>- текстовый файл например, его и подключать к базе
согласен. но не годится, т.к. доступ должен быть только для чтения. разбрасывать же базу по всему серверу (там фейс, там данные, а там структура архива файловой системы) мне не позволят. начальник же (только у него пока полный доступ) обновлять инфу в базе не станет- у него своих дел много.
Я бы давно уже что-нибудь придумал, но в силу приведенных ограничений и решил задать вопрос здесь. Необходимо чтобы результат был сразу же получен пользователем при непосредственном "сканировании" файловой системы архива и отображал информацию В НАСТОЯЩИЙ момент. вот в этом то и загвоздка! | |
|
| |
|
|
|
| тогда только смириться с "потерей времени" хотя ИМХО 2-4 минуты это не так много,
в конце концов можно оптимизировать алгоритм сканирования структуры директорий | |
|
| |
|
|
|
| Уважаемый Explorer!
Вот в том то и вопрос стоит: КАК ИМЕННО можно его оптимизировать?? | |
|
| |
|
|
|
| например не использовать treewiev и подобные-же парадигмы типа деревьев, не использовать рекурсии, и не лезть вглубь структуры, а граничиваться обзором только одного активного уровня
держать активной и проапдейченой только одну директорию, как в RAR'е например | |
|
| |
|
|
|
|
Sub lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
Debug.Print subFolder.path
lstFolders(subFolder.Path)
Next
End Sub
|
работает довольно шустро | |
|
| |
|
|
|
| пасибо большое! это именно то что необходимо.
можно 2 маааленьких вопросика? (я не могу разобраться)-
1)
на строчку
lstFolders (subFolder.Path)
ругается, говорит что нет такой ф-ции (Sub or Function not defined).
как я понимаю,- это просто принимающая адрес функция. если это не так- пожалуйста поправьте меня. спс!
2)
эта функция не ищет директории в поддиректориях (производит поиск только в той, которую указали при запуске ф-ции). можно ли это как-то изменить?
Большое Вам Спасибо! | |
|
| |
|
|
|
| 1. не совсем понятно почему... ну попробуйте так:
Public Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
Debug.Print subFolder.Path
Call lstFolders(subFolder.Path)
Next
End Function
|
2. эта функция возвращает имена ВСЕХ поддиректория находящихся внутри стартовой директории любого уровня вложенности. т.е. если ее вызвать так:
call lstFolders("c:\")
то будут выведены имена ВСЕХ директорий и поддиректорий которые есть на диске "С". | |
|
| |
|
|
|
| Добрый день, osmor!
Хочу Вас еще раз потревожить: функция
lstFolders(subFolder.Path) или
Call lstFolders(subFolder.Path)
все равно не работает! Пишет:
"Compile error:
Sub or Function not defined"
(Error 35)
Более того, ваша функция ищет папки ИМЕННО В КОРНЕ ЗАДАННОЙ, а глубже не лезет. Вот посмотрите, я изменил немного код и приведу Вам пример отработки этой функции:
Function a22()
Dim strNameFolder As String
strNameFolder = "c:\"
Dim Str01 As String
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
'Debug.Print subFolder.Path ' <<вследствии ненужности в данной модификации этой функции
'MsgBox subFolder.Path ' <<вследствии ненужности в данной модификации этой функции
'Call lstFolders(subFolder.Path) '<<вследствии невозможности запуска
Str01 = Str01 & " ; " & subFolder.Path
Next
[Form_Form1].Pole1 = Str01
End Function
А вот результат ее работы (из поля формы):
; C:\113 22 ; C:\Config.Msi ; C:\Documents and Settings ; C:\Program Files ; C:\RECYCLER ; C:\System Volume Information ; C:\WINDOWS
Помогите, плиз! Не бросайте на финише .. :-))
=====
Редактирование сообщения:
Опа! Только что заметил: у Вас происходит рекурсивный запуск функции (т.е. функция сама себя запускает много раз, перед тем как первая отрабатывает до конца и освобождает память). Скажите пожалуйста, если задать этой функции диск "c:\", а на компьютере установлена OS WinXP и памяти оперативной 256 мб, - со второго-третьего запуска, я полагаю, пользователь увидит стандартное сообщение Windows "Не достаточно оперативной памяти...".
А в связи с тем, что имя функции я поменял- соответственно все выше приведенные вопросы (кроме последнего) не имеют смысла. Зато последний..
Спасибо Вам, что написали эту функцию за меня
Выскажете, пожалуйста, Ваше мнение- очень хочется услышать. | |
|
| |
|
|
|
| win xp Sp2
512 мег памяти
диск D - 5108 директорий
С выводом имен в окно отадки отработала за 2 мин 10 сек
без вывода имен за 1 мин 25 сек.
запускал 5 раз
ошибки не получил.
Для уменьшения объема занимаемой памяти можно вынести в Public переменную FSO
и тогда
Set fso = CreateObject("Scripting.FileSystemObject")
определять только один раз .
Наверное так будет правильнее. Даже не наверное, а точно.
а какой последний вопрос? про память? | |
|
| |
|
|
|
| Да, все верно. Последний вопрос был связан с памятью (точнее, с предположением вывода ошибки Windows о переполнении памяти при работе этой функции на компьютерах с малым ее обьемом (256 мб и менее)).
Проверьте меня пожалуйста, правильно ли я понял Ваш поледний совет:
Option Compare Database
Public Fso As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
Public Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Set folder = Fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
Debug.Print subFolder.Path
Call lstFolders(subFolder.Path)
Next
End Function
Правда, возникает ошибка на строке
Set Fso = CreateObject("Scripting.FileSystemObject")
Не подскажете, как от нее можно избавиться (необходимо ведь определять эту переменную только ОДИН раз).
Спасибо. | |
|
| |
|
|
|
|
Option Compare Database
Public Fso As Object
Public Function GetListFolders(strNameFolder As String)
Set Fso = CreateObject("Scripting.FileSystemObject")
Call lstFolders(strNameFolder)
End Function
Private Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Set folder = Fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
Debug.Print subFolder.Path
Call lstFolders(subFolder.Path)
Next
End Function
|
| |
|
| |
|
|
|
| Спасибо вам большое. Буду юзать. | |
|
| |