Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Форум MMB » Всё о программе Multimedia Builder » Общие вопросы по MMB » Как загрузить в список ПОЛНЫЕ ПУТИ к файлам?
Как загрузить в список ПОЛНЫЕ ПУТИ к файлам?
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

Всё хорошо работает, но хотелось бы обойтись ОДНИМ списком.
Потому как мне кажется, что сделал я неумно smile

PS. Просьба - сначала проверяйте сами предложенные вами решения :)

 
YURIYДата: Понедельник, 11 Декабря 2006, 14:10 | Сообщение # 2
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
Выдержка из справки:

Quote
Если вы хотите добавить в список путь к файлу, то используйте параметр STRING перед строкой, содержащей путь:

filename$='STRING:'+ExtractName(Path$)+ExtractExt(Path$)
ListBoxAddItem("SongList","filename$")

Идея ясна? wink



Вечная память Андрею Сергееву!
 
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")
повторяется дважды (я их выделил цветом). В первый раз для того, чтобы
очистить список от результатов предыдущего поиска, во второй раз -
чтобы очистить список от загруженных в него имён.

Всё работает вроде без глюков.
И представляется мне, что другого решения вроде и нет.
А если есть - то милости просим в тему smile

 
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
Всем привет! smile
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)
Что же в моем скрипте не работает, он загружает полные пути к файла, без названий самих файлов...

А-а-а, ну так значит ты не понял задачи. Тогда все ясно.
Полный путь - это как раз путь, ВКЛЮЧАЯ имя файла.
Потому я и написал, что у тебя грузятся урезанные пути smile

Quote (codemaster)
ListBoxAddItem("SongList","RESET") - эту строчку можно убрать, чтобы не дублировать.

Эту строчку НЕ НАДО убирать - так как она очищает список,
если в результате поиска не были найдены файлы.

Quote (Yuriy)
Тогда так:

Юрий, но ведь ты ПОЛНОСТЬЮ ПОВТОРИЛ МОЙ СКРИПТ!!!
Зачем? В чем же новизна? Так нечестно...


Сообщение отредактировал as-master - Среда, 13 Декабря 2006, 15:41
 
as-masterДата: Среда, 13 Декабря 2006, 15:39 | Сообщение # 14
Группа: Удаленные





Вот, качайте пример загрузки в лист путей к файлам.
В примере три варианта (все предложенные мной).
А заодно пример показывает время, требуемое на
формирования списка. Для сравнения всех способов :)
Прикрепления: 32619410.zip (1.6 Kb)
 
YURIYДата: Среда, 13 Декабря 2006, 16:07 | Сообщение # 15
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
Quote (as-master)
Юрий, но ведь ты ПОЛНОСТЬЮ ПОВТОРИЛ МОЙ СКРИПТ!!!

Неправда, я модернизировал скрипт Фаната так, чтобы он и имена выводил. И ты цепляешь три своих варианта, что работают на моём слабом компе ужасно, если брать много файлов, в отличие от моего примера, где всё в сто раз быстрее и всё ок smile

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)
А у вас там дублируется действие. Но наверно, админ всегда прав.

Действительно, про ту строчку я забыл.
Здесь ты прав. При чем тут админ, тем более что я модер smile

 
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

Я очистил этот скрипт от всяких "сервисных" прибамбасов - разных условий,
выдачи всяких сообщений и т.д. И дал его в чистом виде.
 
Форум MMB » Всё о программе Multimedia Builder » Общие вопросы по MMB » Как загрузить в список ПОЛНЫЕ ПУТИ к файлам?
  • Страница 1 из 1
  • 1
Поиск: