NTFS4TC 2 / DiskInternals Reader
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
bob_tm
Ага, ясно. Теперь понимаю почему и cd "... " не срабатывает.
Как вариант предлагаю парсить по соответствующей строке текущего bar-а, если, конечно, есть возможность вычислять какой текущий.
Ага, ясно. Теперь понимаю почему и cd "... " не срабатывает.
Как вариант предлагаю парсить по соответствующей строке текущего bar-а, если, конечно, есть возможность вычислять какой текущий.
Ну, для кнопки уже есть решение по отдельному рефрешу:MVV писал(а):Как вариант, можно создать внутреннюю команду для refresh. Но её нельзя будет выполнить с кнопки, только вручную написать в командной строке и выполнить.
только какое отношение это имеет к обсуждаемой команде перехода?bob_tm писал(а):/L="\\\DiskInterals Reader\<Refresh>" - можно повесить на отдельную кнопку, чтобы делать Refresh когда захочется![]()
Можно, но появляется у тотала в пути "\", а это не хорошоFlasher писал(а):С обратным слешем работает ведь. Значит можно.MVV писал(а):Но проблема тотала в том, что такие команды плагину с кнопки отправлять нельзя.
Я предлагаю сделать две кнопки, первая делает Refresh, а вторая cd.
Получается если вы хотите, чтобы плагин зашел в папку и при этом выполнился Refresh, то жмете первую кнопку, а потом вторую. и все
Если Refresh не нужен, значит жмете только вторую кнопку
bob_tm
В папке TC есть текстовые файлы типа bar, в одном таком нужно осуществлять поиск строки, содержащей paramNNN=\\\DiskInterals Reader\%P*. Если на конце звёздочка, тогда вместе с переходом выполняем рефреш.
Остаётся два вопроса:
1. Можно ли при нажатии кнопки вычислять NNN?
2. Можно ли выявлять путь к текущему bar-файлу по классу/дескриптору компонент всего окна TC.
Вторую проблему можно обойти, если производить поиск сразу во всех bar-ах, не знаю насколько это накладно по времени.
Есть другой вариант. Создаём по аналогии с кнопкой пользовательскую команду в файле usercmd.ini c названием, например, em_OpenPathInDiskInterals.
Но тут опять вопрос: может ли плагин вычислить, какая команда TC его вызвала, чтобы после выполнить рефреш?
В папке TC есть текстовые файлы типа bar, в одном таком нужно осуществлять поиск строки, содержащей paramNNN=\\\DiskInterals Reader\%P*. Если на конце звёздочка, тогда вместе с переходом выполняем рефреш.
Остаётся два вопроса:
1. Можно ли при нажатии кнопки вычислять NNN?
2. Можно ли выявлять путь к текущему bar-файлу по классу/дескриптору компонент всего окна TC.
Вторую проблему можно обойти, если производить поиск сразу во всех bar-ах, не знаю насколько это накладно по времени.
Есть другой вариант. Создаём по аналогии с кнопкой пользовательскую команду в файле usercmd.ini c названием, например, em_OpenPathInDiskInterals.
Но тут опять вопрос: может ли плагин вычислить, какая команда TC его вызвала, чтобы после выполнить рефреш?
Костыли... Думаю, правильнее было бы в таком случае сделать вот как:
Обычный переход:
Переход с обновлением:
При этом содержимое любой подпапки Refresh всегда возвращается как пустое (только элемент . - если ниче вообще не вернуть, тотал подумает, что возникла ошибка). Но когда плагин получает запрос на чтение содержимого такой папки, он выполняет refresh и потом посылает тоталу сообщение WM_COPYDATA с командой cd, подставляя путь без папки Refresh и указывая в параметрах, что открыть путь надо в активной панели. В итоге тотал тут же откроет в этой панели интересующую пользователя папку. Но здесь нужно, чтобы плагин знал своё корневое имя (имя в сетевом окружении). Пример кода для отправки такой команды (из Virtual Panel):
(сообщение посылается в фоновом потоке)
Хотя, наверное, можно и просто продублировать ту же иерархию в папке Refresh, что и без неё - но тогда в пути появится дополнительный каталог верхнего уровня.
Обычный переход:
Код: Выделить всё
cd
\\\DiskInterals Reader\%PКод: Выделить всё
cd
\\\DiskInterals Reader\Refresh\%PКод: Выделить всё
struct BackgroundSendDataData {
COPYDATASTRUCT CopyData;
char Raw[1];
};
DWORD __stdcall BackgroundSendData(void* Data) {
BackgroundSendDataData* bsd=(BackgroundSendDataData*)Data;
std::auto_ptr<char> ash((char*)Data);
SendMessage(hMainWnd, WM_COPYDATA, 0, (LPARAM)&bsd->CopyData);
return 0;
}
bool ChangeCurrentDir(const wchar_t* Path, bool NewTab) {
int length=lstrlen(Path), reserve=length*(Unicode ? 4 : 1);
std::auto_ptr<char> ash(new char[sizeof(BackgroundSendDataData)+16+reserve]);
BackgroundSendDataData* bsd=(BackgroundSendDataData*)ash.get();
bsd->CopyData.dwData='DC';
bsd->CopyData.lpData=bsd->Raw;
char* p=bsd->Raw;
if (Unicode) p+=wsprintfA(p, "\xEF\xBB\xBF");
p+=WideCharToMultiByte(Unicode ? CP_UTF8 : CP_ACP, 0, Path, length, p, reserve, 0, 0);
p+=wsprintfA(p, "\r%cS%s", 0, NewTab ? "T" : "");
bsd->CopyData.cbData=p-bsd->Raw+1;
HANDLE thread=CreateThread(0, 0, &BackgroundSendData, ash.get(), 0, 0);
if (!thread) return 0;
ash.release();
CloseHandle(thread);
return 1;
}
Хотя, наверное, можно и просто продублировать ту же иерархию в папке Refresh, что и без неё - но тогда в пути появится дополнительный каталог верхнего уровня.
Опять те же грабли со вторым слешем, только уже перед %P, а не после? Это ещё хуже.MVV писал(а):Переход с обновлением:При этом содержимое любой подпапки Refresh всегда возвращается как пустоеКод: Выделить всё
cd \\\DiskInterals Reader\Refresh\%P
Ну, я предложил идею, а грамотно вырезать лишнюю папку из пути - уже задача автора плагина. 
Но если учесть, что путь будет начинаться с имени этой папки, нужно будет просто прибавить её длину к указателю на строку, чтобы получить правильный путь для перехода. Если функция FsFindFirst получит путь в виде \Refresh\c:\1\, то после прибавления 8 к указателю на начало строки получится указатель на строку \c:\1\. Останется лишь приписать спереди \\\ и имя плагина.
Но если учесть, что путь будет начинаться с имени этой папки, нужно будет просто прибавить её длину к указателю на строку, чтобы получить правильный путь для перехода. Если функция FsFindFirst получит путь в виде \Refresh\c:\1\, то после прибавления 8 к указателю на начало строки получится указатель на строку \c:\1\. Останется лишь приписать спереди \\\ и имя плагина.