Странное поведение FsRenMovFile

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

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

Ответить
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Странное поведение FsRenMovFile

Сообщение Maximus »

Есть вот такая функция:

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

extern "C" __declspec(dllexport) int  __stdcall FsRenMovFile(char* OldName,char* NewName,bool Move,bool OverWrite,RemoteInfoStruct* ri)
{
    if(!strcmp(OldName,NewName)) return FS_FILE_OK;
    if(Move)
    {
        if(!OverWrite)
        {
            return RenameItem(OldName,NewName);//моя функция
        }
    }
    return FS_FILE_NOTSUPPORTED;
}
Реализовано только перемещение без замены.
В остальных случаях возвращаю FS_FILE_NOTSUPPORTED.

Очень удивило, когда при вызове копирования, ТС с удовольствием положил на возвращенный ему FS_FILE_NOTSUPPORTED и скопировал директорию со всеми поддиректориями.
При этом в файле справки нигде не сказано, что ТС вызывает функцию FsMkDir во время копирования...
Приятно конечно, что работы меньше, но предупреждать же надо :)
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Да, я тоже натыкался на это. Логика ТС тут такая - раз плагин сам не поддерживает перенос файлов - будем работать через копирование и удаление.
Maximus писал(а):Приятно конечно, что работы меньше,...
Программисту - да. Но если юзер нажмет F6 когда обе панели на твоем плагине, то ТС будет копировать файлы через хард.
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

VadiMGP писал(а):Да, я тоже натыкался на это. Логика ТС тут такая - раз плагин сам не поддерживает перенос файлов - будем работать через копирование и удаление.
Мне показалось, что тут без вариантов - он всегда работает через копирование и удаление.
По крайней мере при переносе, что бы я ни возвращал, ТС всегда работает через переименование и удаление.
Я не вижу возможности надавать ТС по рукам и сделать все самому...
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

И как же в таком случае побороться с копированием переносом в себя? Если ТС все равно продолжает копирование после того, как сказать ему, что не надо больше...
Помогает только FS_FILE_USERABORT... и то одну папку все равно создает.
Почему нет функции FsRenMovDir? И как же теперь жить? :)
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Maximus писал(а):И как же в таком случае побороться с копированием переносом в себя?
A почему с этим надо бороться? Ну создал юзер в твоем плагине две директории, а потом хочет содержимое одной перенести в другую. Почему он не должен иметь возможности это сделать?
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

VadiMGP писал(а):A почему с этим надо бороться? Ну создал юзер в твоем плагине две директории, а потом хочет содержимое одной перенести в другую. Почему он не должен иметь возможности это сделать?
Я имел в виду копирование директории саму в себя. Попробуй сделать это в ТС и увидишь, что он тебе скажет:
---------------------------
Total Commander
---------------------------
Нельзя копировать/перемещать каталог и создавать ярлык для него
[здесь: E:\anb],
если адресатом указан его же подкаталог:
[E:\anb\anb]

---------------------------
ОК
---------------------------
А потом попробуй сделать такое же в плагине. И будет копировать не до бесконечности конечно... но он не должен делать этого...
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Я знаю только один способ.
В FsStatusInfo взводить флаг и запоминать откуда идет перенос. А в MkDir проверять создается ли директория в процессе переноса и не в дочерней ли директории. Если да - бить юзеру по рукам.
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

Т.е. через одно место :)
Это должно быть предусмотрено в интерфейсе WFX-плагинов. И не только это...
Ответить