как получить пути в FS плагине

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
zvyagaaa
Сообщения: 46
Зарегистрирован: Пн авг 31, 2009 10:38

как получить пути в FS плагине

Сообщение zvyagaaa »

Добрый день, хочу сделать FS плагин, сейчас разбираюсь, на дельфи. Вроде бы разобрался с обработкой нажатия на "файл" в окне WFS

Код: Выделить всё

function FsExecuteFile(MainWin:thandle;RemoteName,Verb:pchar):integer; stdcall;
var tempname:string;
Begin
//Запуск файла
result:=FS_EXEC_OK;
   tempname:= RemoteName;
if tempname='\[Запустить файл]' then
MessageBox (FindTCWindow,PAnsiChar(tempname),verb,MB_OK+MB_IconInformation);
End;
не могу разобраться как можно получать пути файлов, при их копировании в панель плагина.
Сейчас делаю так

Код: Выделить всё

 function FsPutFile(LocalName,RemoteName:pchar;CopyFlags:integer):integer; stdcall;
begin
//Копирование файла в файловую систему плагина
RemoteName:=LocalName;
result:=FS_FILE_OK;
end;
Файл копируется, никаких ошибок не вываливается, но в панели файл не появляется.
Подскажите, в какую сторону копать?
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

zvyagaaa
"Копирование" является внутренней функцией плагина и должно реализовываться целиком и полностью разработчиком. Поскольку плагин предоставляет Тоталу содержимое виртуальной файловой системы, то эта файловая система должна где-то у плагина храниться. Когда Тотал запрашивает список через FsFindFirst/FsFindNext, плагин обращается к этой базе и отдаёт Тоталу актуальный список файлов. Когда пользователь хочет добавить новый файл, вызывается FsPutFile, и плагин должен обеспечить обновление содержимого базы, чтобы этот новый файл туда попал, а Тотал после этого снова обратится к плагину, перечитает список файлов и увидит, что новый файл там появился.

Как у тебя вообще сейчас реализованы FsFindFirst и FsFindNext?
Почему же, ё-моё, ты нигде не пишешь "ё"?
zvyagaaa
Сообщения: 46
Зарегистрирован: Пн авг 31, 2009 10:38

Сообщение zvyagaaa »

Код: Выделить всё

function FsFindFirst( 
  path :pchar; 
  var FindData: tWIN32FINDDATA ) 
: thandle; stdcall; 
begin 
  FillChar( FindData, SizeOf( FindData ), 0 ); 
  StrPCopy( FindData.cFileName, '[Запустить файл]' );
  Result := 13; 
end; 

function FsFindNext( 
  Hdl: thandle; 
  var FindData:tWIN32FINDDATA ) 
: bool; stdcall; 
begin 
  Result := False; 
end;

Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

zvyagaaa
Ну и откуда тут может появиться скопированный файл? Ты всегда возвращаешь Тоталу информацию, что у тебя ровно один объект с именем [Запустить файл]. Как же Тотал может в этой ситуации показать что-либо иное?
Почему же, ё-моё, ты нигде не пишешь "ё"?
zvyagaaa
Сообщения: 46
Зарегистрирован: Пн авг 31, 2009 10:38

Сообщение zvyagaaa »

а как тогда? есть пример кода?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Для начала, что должен делать плагин? Какие объекты он должен отображать? Для чего он?

Когда разберёшься, что будет храниться в файловой системе плагина, сразу станет понятно, список чего возвращать тоталу при запросе содержимого.

На FsFindFirst возвращаешь информацию о первом объекте, соответствующем запрашиваемому пути, на каждый вызов FsFindNext - очередной объект, пока не перечислишь все. Потом говоришь, что больше объектов нет. Например, если объекты у тебя хранятся тупо в массиве, то при возвращении очередного элемента увеличиваешь на 1 индекс в массиве, пока не дойдёшь до конца.
zvyagaaa
Сообщения: 46
Зарегистрирован: Пн авг 31, 2009 10:38

Сообщение zvyagaaa »

Для начала, что должен делать плагин? Какие объекты он должен отображать? Для чего он?
Для пакетной обработки файлов. Объекты должен отображать - файлы (точнее ссылки на реальные файлы). Я вижу это так. Я копирую файлы на панель, потом жму на выполнить, список с панели обрабатывается. Как в Complex CD.
Изображение
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

В таком случае заведи себе массив (или динамический список, или очередь), куда добавляй файлы по FsPutFile, а по FsFindFirst/FsFindNext перечисляй содержимое массива. Инфу, которую тотал хочет получить по каждому файлу (структура WIN32FINDDATA), можно получить, вызывая виндовую функцию FindFirstFile, если передать ей путь к файлу.
zvyagaaa
Сообщения: 46
Зарегистрирован: Пн авг 31, 2009 10:38

Сообщение zvyagaaa »

с этим вопросом я разобрался, а подскажите как теперь мне сделать папку и все скопированные файлы, чтобы попадали в папку? с папкой не получается :(
может кто-нибудь на пальцах объяснить как тут папки делать?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Возвращаешь тоталу атрибут FILE_ATTRIBUTE_DIRECTORY у элементов, которые у тебя представляют папки. И когда тотал будет запрашивать их содержимое (это будет видно по пути при вызове FsFindFirst), перечисляешь уже не содержимое основной папки плагина, а этой подпапки.
Ответить