воскресенье, мая 22, 2005

Список файлов на FTP-сервере при помощи FAR'а

Озаботился задачей получить список файлов на фтп-сервере - чтобы использовать в качестве плей-листа.
Открыл FarNavigator, зашёл на сервер, запустил S&R (в надежде на его плагин) - и обломался.
Пришлось городить скрипт. Тут тоже оказалось не всё просто. Вот лучшее, что удалось поначалу соорудить:
Sub Script_OnOpen(From)
Far.PostKeySequence far.CreateKeySequence("CtrlF CtrlIns Esc Down"),true
Dim fso 'as FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
set list=fso.OpenTextFile("G:\Music\list.txt",8,True,False)
list.WriteLine Far.Clipboard
end sub

Будучи посаженным на клавишу, этот скрипт даёт возможность получить в указанном файле список имён файлов на панели.
Однако Far.Clipboard выдаёт значение, попавшее туда на предыдущем вызове. Поэтому на последнем файле надо вызывать два раза, а потом вычищать руками мусор из начала списка.

После размышлений поменял вызовы местами и получился макрос "CtrlF CtrlIns Esc Down F11 z e", где на "F11 z e" вызывается скрипт без Far.PostKeySequence .
Изврат, конечно, но работает.

Кстати, средства обработать таким образом только помеченные файлы не придумал :-(

И ещё - плагин FTP от Мамаева не годится - на CtrlF выдаёт имена в кавычках.

В конце концов
Макрос стал такой: CtrlF Down F11 z e Esc, а на F11 z e вызывается такой скрипт:
Sub Script_OnOpen(From) 'CtrlF CtrlIns Esc
Dim fso 'as FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
set list=fso.OpenTextFile("G:\Music\My Playlists\list.txt",8,True,False)
ss= trim(getCommandLine)
If ss="" then
Far.Msg "Command line empty :-("
exit sub
End If

'Чистим кавычки
if mid(ss,1,1)="""" then ss=mid(ss,2)
if mid(ss,len(ss)-0,1)="""" then ss=mid(ss,1,len(ss)-1)
list.WriteLine ss
end sub
function getCommandLine() 'Присоветовал А.Гутман
set b = FARAPI.newBlock()
b.allocate 1024
FARAPI.Control Cnst.INVALID_HANDLE_VALUE,Cnst.FCTL_GETCMDLINE,b
getCommandLine = b.asString(0)
end function


При этом можно и с плагином Мамаева работать.
В итоге получается файл со списком полных имён без всяких дурацких кавычек. Этот файл можно использовать как плей-лист, а можно и переименовать в m3u этим вот скриптом:
function Script::OnOpen(){
var ib //: IInputBox
=CreateInputBox();
ib.Title="New file name"
ib.Prompt="Rename '"+Far.Panel.Current.Name+"' to "
var fn //: String
=Far.Panel.Current.Path
var Fso //: FileSystemObject
= new ActiveXObject("Scripting.FileSystemObject")
var text //:TextStream
=Fso.OpenTextFile(fn)
ib.Text=text.ReadLine() + ".m3u"
if(ib.Show()){
text.Close()
Fso.GetFile(fn).Name = ib.Text
}
}

А можно и преобразовать в wml (плейлист для WMP) вот этим скриптом:
function Script::OnOpen(){
var fn //:String
=Far.Panel.Current.Path
var ib //: IInputBox
=CreateInputBox();
ib.Prompt="Play List name"
ib.Title="Create WMP-playlist from ["+fn+"]"
ib.History="wpls"
var Fso //: FileSystemObject
= new ActiveXObject("Scripting.FileSystemObject")
var text //:TextStream
=Fso.OpenTextFile(fn)
var ss //: String
=text.ReadLine()
ib.Text=ss;
if(!ib.Show()) return; //Не желают...
//reopen
text.Close(); text=Fso.OpenTextFile(fn)
var wpl //as DOMDocument
= new ActiveXObject("Msxml2.DOMDocument")
var smil //: IXMLDOMElement
=wpl.documentElement=wpl.createElement("smil")
var head //: IXMLDOMElement
=wpl.createElement("head")
var title //: IXMLDOMElement
=wpl.createElement("title")
var ListName=ib.Text
head.appendChild(title)
smil.appendChild(head)
var body //: IXMLDOMElement
=wpl.createElement("body")
var seq //: IXMLDOMElement
=wpl.createElement("seq")
var media //: IXMLDOMElement
var src //: IXMLDOMAttribute
while (!text.AtEndOfStream){
ss=text.ReadLine()
if(ss!=""){
media=wpl.createElement("media")
src=wpl.createAttribute("src")
src.value=ss
media.attributes.setNamedItem(src)
seq.appendChild(media)
}
}
text.Close()
body.appendChild(seq)
smil.appendChild(body)
title.text=ListName
wpl.save(ListName+".wpl")
}

Отправить комментарий