Как загрузить в список ПОЛНЫЕ ПУТИ к файлам?
|
|
as-master | Дата: Понедельник, 11 Декабря 2006, 12:26 | Сообщение # 1 |
Группа: Удаленные
| Вопрос: как загрузить в список не имена файлов, а ПОЛНЫЕ ПУТИ К НИМ? Уточнение: список формируется не после команды OpenFile(), а после команд BrowseForFolder() и SearchForFiles(), то есть файлы в списке могут быть из разных папок со всего диска (если это имеет какое-нибудь значение). Пока я решил проблему с помощью вспомогательного списка таким образом. После указанных команд формируется вспомогательный список List: ListBoxAddItem("List","<List>") А затем уже формируется основной список SongList примерно так: ListBoxGetItems("List","Items$,Num$,#,Num") For i=1 To Num Items$[i]=GetArrayItem(Items$,#,i) ListBoxAddItem("SongList","STRING:Items[i]$") Next i Всё хорошо работает, но хотелось бы обойтись ОДНИМ списком. Потому как мне кажется, что сделал я неумно PS. Просьба - сначала проверяйте сами предложенные вами решения :)
|
|
| |
YURIY | Дата: Понедельник, 11 Декабря 2006, 14:10 | Сообщение # 2 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Выдержка из справки: Quote | Если вы хотите добавить в список путь к файлу, то используйте параметр STRING перед строкой, содержащей путь: filename$='STRING:'+ExtractName(Path$)+ExtractExt(Path$) ListBoxAddItem("SongList","filename$") | Идея ясна?
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Понедельник, 11 Декабря 2006, 15:39 | Сообщение # 3 |
Группа: Удаленные
| Quote (Yuriy) | Выдержка из справки: | Юрий, я и сам читал именно эту выдержку! И что с того? Во-первых, где у меня этот самый Path$ ? Во-вторых, ты сам-то проанализируй, что получится в этом примере. И в-третьих, вот это: Quote (as-master) | PS. Просьба - сначала проверяйте сами предложенные вами решения :) |
Сообщение отредактировал as-master - Понедельник, 11 Декабря 2006, 15:40 |
|
| |
YURIY | Дата: Понедельник, 11 Декабря 2006, 16:36 | Сообщение # 4 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Да, верно... Поэкспериментировал тут - действительно, эта команда не всегда "выручит", или я не найду решение... Хуже этого придумать не мог, зато одним списком: Code | ListBoxGetItems("SongList","Items$,Num$,#,Num") ListBoxAddItem("SongList","RESET") For i=1 To Num Items$[i]=GetArrayItem(Items$,#,i) ListBoxAddItem("SongList","STRING:Items[i]$") Next i | Извини уж... P. S. Пускаешь эту команду, когда в список загрузишь все файлы!
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Понедельник, 11 Декабря 2006, 17:46 | Сообщение # 5 |
Группа: Удаленные
| Вобщем, поэкспериментировал я тут - действительно получается использовать один и тот же список, попеременно загружая туда сначала имена файлов, а потом удаляя их и загружая пути. Вот полностью работоспособный сценарий: BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then SearchForFiles("seldir$","jpg") If (CBK_NumInList>0) Then ListBoxAddItem("SongList","RESET") ListBoxAddItem("SongList","<List>") ListBoxGetItems("SongList","Items$,Num$,#,Num") ListBoxAddItem("SongList","RESET") For i=1 To Num Items$[i]=GetArrayItem(Items$,#,i) ListBoxAddItem("SongList","STRING:Items[i]$") Next i ListBoxGetItems("SongList","<List>") ListBoxGetItems("SongList","Item$,NumItem$,#,NumItem") Else Message("Извините, ничего не найдено!","") ListBoxAddItem("SongList","RESET") End End Обращаю внимание на то, что строчка ListBoxAddItem("SongList","RESET") повторяется дважды (я их выделил цветом). В первый раз для того, чтобы очистить список от результатов предыдущего поиска, во второй раз - чтобы очистить список от загруженных в него имён. Всё работает вроде без глюков. И представляется мне, что другого решения вроде и нет. А если есть - то милости просим в тему
|
|
| |
YURIY | Дата: Понедельник, 11 Декабря 2006, 17:53 | Сообщение # 6 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Другой выход обязательно есть... Вот только сообразить надо...
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Вторник, 12 Декабря 2006, 18:44 | Сообщение # 7 |
Группа: Удаленные
| Есть, что добавить в тему. При таком способе формирования списка загрузка его идёт медленнее, чем при формировании списка просто командой ListBoxAddItem("SongList","<List>"). Вероятно, это связано с обработкой массива. А при достаточно большом количестве найденных файлов программа вообще может зависнуть. Устранить эту проблему удалось (вроде бы) введением в цикл команды Refresh(). Так, на формирование списка из 3000 пунктов таким вот способом программе потребовалось около полутора минут. Так что тема, возможно, еще далеко не закрыта. Добавлено (12 Декабря 2006, 18:25) --------------------------------------------- Так и есть! Я нашел лучший способ формирования списка с полными путями к файлам. Который работает заметно быстрее первого сценария, нарисованного в этом топике. Особенно это заметно при большом количестве файлов. Почему? Потому-что у первого варианта (см. выше на этой странице) есть одна очень интересная странность: если на поиск 500 файлов он трати 3 секунды, то на поиск 1000 файлов уже не 6 секунд, как по идее должно быть, а все 20. А на 2000 файлов затрачивается уже... ни много ни мало - 45 секунд! С чем это связано - загадка. Видимо, всё-таки как-то с обработкой массива. Итак, вот более быстрый вариант: Code | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","jpg") If (CBK_NumInList>0) Then For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") finddrive$=ExtractDrive(Text$) finddir$=ExtractDir(Text$) findname$=ExtractName(Text$) findext$=ExtractExt(Text$) find$=finddrive$ + finddir$ + findname$ + findext$ ListBoxAddItem("SongList","STRING:find$") Refresh("") Next i ListBoxGetItems("SongList","<List>") ListBoxGetItems("SongList","Item$,NumItem$,#,NumItem") Else Message("Извините, ничего не найдено!","") ListBoxAddItem("SongList","RESET") End End | Несмотря на то, что сам скрипт несколько длинее, работает он значительно быстрее: 2000 файлов загружает у меня за 7 секунд. Завтра выложу на сайт пример, использующий оба варианта и заодно подсчитывающий затраченное время на поиск и загрузку файлов. Для наглядного сравнения. Ну что, думаю - закрывать тему рано? Надеюсь, еще будут варианты :) Добавлено (12 Декабря 2006, 18:44) --------------------------------------------- Действительно, я иногда туплю. Вот еще более короткий вариант, и более быстрый: Code | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","jpg") If (CBK_NumInList>0) Then For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") ListBoxAddItem("SongList","STRING:Text$") Refresh("") Next i ListBoxGetItems("SongList","<List>") ListBoxGetItems("SongList","Item$,NumItem$,#,NumItem") Else Message("Извините, ничего не найдено!","") ListBoxAddItem("SongList","RESET") End End | 2000 файлов загружаются за 6 секунд, 3000 - за 9 секунд. Теперь мне думается, что иначе уже сделать нельзя. Или продолжаем? :)
|
|
| |
Fanat | Дата: Среда, 13 Декабря 2006, 08:41 | Сообщение # 8 |
MMB Club
Группа: Проверенные
Сообщений: 7
Репутация: 0
Награды: 0
Статус: Offline
| Quote | Ну что, думаю - закрывать тему рано? Надеюсь, еще будут варианты :) | Думаю, что правильнее написать так: Code | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","*.jpg") For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") file_name$=ExtractName(Text$)+ExtractExt(Text$) amount=LEN(file_name$) full_amount=LEN(Text$) copy=full_amount-amount retstr$=StrCopy(Text$,1,copy) ListBoxAddItem("SongList","STRING:retstr$") Next i Else Message("Извините, ничего не найдено!","") End |
Сообщение отредактировал Fanat - Среда, 13 Декабря 2006, 08:49 |
|
| |
as-master | Дата: Среда, 13 Декабря 2006, 12:22 | Сообщение # 9 |
Группа: Удаленные
| Quote (Fanat) | Думаю, что правильнее написать так: | Ну, ребята, так не пойдет... Вспомните, что я написал в самом начале топика: проверяйте свои скрипты! А твой скрипт НЕ РАБОТАЕТ: Он загружает в список обрезанные пути. В отличие от моего варианта. Который работает безупречно. Это во-первых. А во-вторых: в каком же месте это правильнее? К чему вот эти все навороты: Code | file_name$=ExtractName(Text$)+ExtractExt(Text$) amount=LEN(file_name$) full_amount=LEN(Text$) copy=full_amount-amount retstr$=StrCopy(Te xt$,1,copy) ListBoxAddItem("SongList","STRING:retstr$") | Когда достаточно ВСЕГО ОДНОЙ СТРОКИ: Code | ListBoxAddItem("SongList","STRING:Text$") | И зачем убрал мое условие: If (CBK_NumInList>0) Then Теперь у тебя сообщение "Извините, ничего не найдено" будет выскакивать не тогда, когда реально количество найденных файлов равно нулю, а тогда, когда пользователь нажмет отмену при выборе папки... :-(
|
|
| |
Fanat | Дата: Среда, 13 Декабря 2006, 13:59 | Сообщение # 10 |
MMB Club
Группа: Проверенные
Сообщений: 7
Репутация: 0
Награды: 0
Статус: Offline
| Андрей, как звучал вопрос? Quote | Вопрос: как загрузить в список не имена файлов, а ПОЛНЫЕ ПУТИ К НИМ? | Что же в моем скрипте не работает, он загружает полные пути к файла, без названий самих файлов...
|
|
| |
YURIY | Дата: Среда, 13 Декабря 2006, 14:46 | Сообщение # 11 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Тогда так: Code | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","*.jpg") For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") ListBoxAddItem("SongList","STRING:Text$") Next i Else Message("Извините, ничего не найдено!","") End |
Вечная память Андрею Сергееву!
|
|
| |
codemaster | Дата: Среда, 13 Декабря 2006, 14:53 | Сообщение # 12 |
Новый участник
Группа: Пользователи
Сообщений: 10
Репутация: 0
Награды: 0
Статус: Offline
| Всем привет! as-master, Code | Else Message("Извините, ничего не найдено!","") ListBoxAddItem("SongList","RESET") End | ListBoxAddItem("SongList","RESET") - эту строчку можно убрать, чтобы не дублировать. P.S. Вот Yuriy и поправил.
Сообщение отредактировал codemaster - Среда, 13 Декабря 2006, 14:55 |
|
| |
as-master | Дата: Среда, 13 Декабря 2006, 15:32 | Сообщение # 13 |
Группа: Удаленные
| Quote (Fanat) | Что же в моем скрипте не работает, он загружает полные пути к файла, без названий самих файлов... | А-а-а, ну так значит ты не понял задачи. Тогда все ясно. Полный путь - это как раз путь, ВКЛЮЧАЯ имя файла. Потому я и написал, что у тебя грузятся урезанные пути Quote (codemaster) | ListBoxAddItem("SongList","RESET") - эту строчку можно убрать, чтобы не дублировать. | Эту строчку НЕ НАДО убирать - так как она очищает список, если в результате поиска не были найдены файлы.
Юрий, но ведь ты ПОЛНОСТЬЮ ПОВТОРИЛ МОЙ СКРИПТ!!! Зачем? В чем же новизна? Так нечестно...
Сообщение отредактировал as-master - Среда, 13 Декабря 2006, 15:41 |
|
| |
as-master | Дата: Среда, 13 Декабря 2006, 15:39 | Сообщение # 14 |
Группа: Удаленные
| Вот, качайте пример загрузки в лист путей к файлам. В примере три варианта (все предложенные мной). А заодно пример показывает время, требуемое на формирования списка. Для сравнения всех способов :)
|
|
| |
YURIY | Дата: Среда, 13 Декабря 2006, 16:07 | Сообщение # 15 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (as-master) | Юрий, но ведь ты ПОЛНОСТЬЮ ПОВТОРИЛ МОЙ СКРИПТ!!! | Неправда, я модернизировал скрипт Фаната так, чтобы он и имена выводил. И ты цепляешь три своих варианта, что работают на моём слабом компе ужасно, если брать много файлов, в отличие от моего примера, где всё в сто раз быстрее и всё ок P. S. Добавил на сайт чат. В меню сайта.
Вечная память Андрею Сергееву!
|
|
| |
codemaster | Дата: Среда, 13 Декабря 2006, 16:11 | Сообщение # 16 |
Новый участник
Группа: Пользователи
Сообщений: 10
Репутация: 0
Награды: 0
Статус: Offline
| Quote (as-master) | Эту строчку НЕ НАДО убирать - так как она очищает список, если в результате поиска не были найдены файлы. | Вы уже очистили список, прямо после того, как выбрали папку. Посмотрите внимательно: Quote | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir If (seldir$ <> '') Then ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","jpg") If (CBK_NumInList>0) Then For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") ListBoxAddItem("SongList","STRING:Text$") Refresh("") Next i ListBoxGetItems("SongList","<List>") ListBoxGetItems("SongList","Item$,NumItem$,#,NumItem") Else Message("Извините, ничего не найдено!","") ListBoxAddItem("SongList","RESET") End End | Ваш скрипт очищает список в любом случае, были найдены файлики или нет. А так как, если файлы не были найдены, то и очищать в списке нечего, т.к. скрипт сразу переходит к строке Code | Else Message("Извините, ничего не найдено!","") | А у вас там дублируется действие. Но наверно, админ всегда прав.
Сообщение отредактировал codemaster - Среда, 13 Декабря 2006, 16:12 |
|
| |
as-master | Дата: Среда, 13 Декабря 2006, 18:35 | Сообщение # 17 |
Группа: Удаленные
| Quote (codemaster) | А у вас там дублируется действие. Но наверно, админ всегда прав. | Действительно, про ту строчку я забыл. Здесь ты прав. При чем тут админ, тем более что я модер
|
|
| |
YURIY | Дата: Среда, 13 Декабря 2006, 19:51 | Сообщение # 18 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (codemaster) | Но наверно, админ всегда прав. | Вот тут не надо... Человек - не Бог, ошибится и я могу, и вы, и все мы. Добавлено (13 Декабря 2006, 19:51) --------------------------------------------- Quote (as-master) | Юрий, но ведь ты ПОЛНОСТЬЮ ПОВТОРИЛ МОЙ СКРИПТ!!! | Ой, и правда! Переделал скрипт Фаната и на те... Сорри!
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Среда, 13 Декабря 2006, 23:23 | Сообщение # 19 |
Группа: Удаленные
| ПОДВОЖУ ИТОГ, Итак, на сегодняшний день пока лучший и наиболее быстрый вариант скрипта загрузки путей к файлам в список такой: Code | BrowseForFolder("Укажите папку, где искать:","") seldir$=CBK_OpenDir ListBoxAddItem("SongList","RESET") SearchForFiles("seldir$","jpg") For i=1 To CBK_NumInList LoadText("Text$","STRING:<List>i") ListBoxAddItem("SongList","STRING:Text$") Next i | Я очистил этот скрипт от всяких "сервисных" прибамбасов - разных условий, выдачи всяких сообщений и т.д. И дал его в чистом виде.
|
|
| |