Страница 1 из 1

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

Добавлено: Вс мар 23, 2008 18:16
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 во время копирования...
Приятно конечно, что работы меньше, но предупреждать же надо :)

Добавлено: Вс мар 23, 2008 20:28
VadiMGP
Да, я тоже натыкался на это. Логика ТС тут такая - раз плагин сам не поддерживает перенос файлов - будем работать через копирование и удаление.
Maximus писал(а):Приятно конечно, что работы меньше,...
Программисту - да. Но если юзер нажмет F6 когда обе панели на твоем плагине, то ТС будет копировать файлы через хард.

Добавлено: Вс мар 23, 2008 20:49
Maximus
VadiMGP писал(а):Да, я тоже натыкался на это. Логика ТС тут такая - раз плагин сам не поддерживает перенос файлов - будем работать через копирование и удаление.
Мне показалось, что тут без вариантов - он всегда работает через копирование и удаление.
По крайней мере при переносе, что бы я ни возвращал, ТС всегда работает через переименование и удаление.
Я не вижу возможности надавать ТС по рукам и сделать все самому...

Добавлено: Вс мар 23, 2008 22:26
Maximus
И как же в таком случае побороться с копированием переносом в себя? Если ТС все равно продолжает копирование после того, как сказать ему, что не надо больше...
Помогает только FS_FILE_USERABORT... и то одну папку все равно создает.
Почему нет функции FsRenMovDir? И как же теперь жить? :)

Добавлено: Пн мар 24, 2008 00:33
VadiMGP
Maximus писал(а):И как же в таком случае побороться с копированием переносом в себя?
A почему с этим надо бороться? Ну создал юзер в твоем плагине две директории, а потом хочет содержимое одной перенести в другую. Почему он не должен иметь возможности это сделать?

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

---------------------------
ОК
---------------------------
А потом попробуй сделать такое же в плагине. И будет копировать не до бесконечности конечно... но он не должен делать этого...

Добавлено: Пн мар 24, 2008 10:08
VadiMGP
Я знаю только один способ.
В FsStatusInfo взводить флаг и запоминать откуда идет перенос. А в MkDir проверять создается ли директория в процессе переноса и не в дочерней ли директории. Если да - бить юзеру по рукам.

Добавлено: Пн мар 24, 2008 13:18
Maximus
Т.е. через одно место :)
Это должно быть предусмотрено в интерфейсе WFX-плагинов. И не только это...