Хотелось бы иметь возможность перейти с одного диска на другой, не изменяя при этом каталог (кроме буквы диска), нажав на Ctrl (или Alt) и кнопку смены диска.
Т.е. текущий каталог
C:\Temp\
я нажимаю Ctrl+[Drive D] и получаю
D:\Temp\
Разумеется, это должно работать и для нескольких уровней вложенности, причём, если начиная с какого-то уровня совпадений нет, то должен быть получен именно он, т.е. из
C:\Temp\SomeFolder1\SomeFolder2\SomeFolder3\StopHere\QQQ\WWW\
я должен получить
D:\Temp\SomeFolder1\SomeFolder2\SomeFolder3\StopHere\
при условии отсутствия в ней папки QQQ.
Ещё, по возможности, хотелось бы сделать возможным переход в папку с похожим именем, например из
C:\Temp\SomeFolder1\SomeFolde
r2\Some
Folder3\StopHere\
в
D:\Temp\SomeFol
lder1\SomeFolde2\Some
Dolder3\StopHere
!\
Для этого предлагаю в случае отсутствия точного совпадения имён, найти все каталоги, имена которых отличаются по длине не более чем на один символ, и проверить, есть ли такие, из которых можно получить исходное имя путём изменения, добавления или удаления одного символа. Это можно сделать с помощью следующей функции:
Код: Выделить всё
bool check(char *s1, unsigned l1, char *s2, unsigned l2)
{
char *e1=s1+l1-1, *e2=s2+l2-1;
for(; *s1==*s2; ++s1,++s2);
for(; *e1==*e2; --e1,--e2);
return e1<=s1 && e2<=s2;
}
Здесь s1 и s2 - указатели на строки; l1 и l2 - длины строк s1 и s2 соответствено. Длины передаются для ускорения выполнения функции (т.к. для получения длины строки, её надо пройти до конца, а раньше уже должна была быть сделана проверка, что эти длины отличаются не более, чем на 1).
Если получено несколько вариантов, выбрать одно из следующих действий:
1. посмотреть, какой из них даёт лучшее совпадение последующих каталогов (не считаю этот вариант хорошим - может потребоваться слишком много времени);
2. выбрать любой (считаю этот вариант лучшим, кроме 5);
3. считать, что подходящего каталога нет;
4. спросить у пользователя, в какой перейти (тоже плохой вариант, т.к. возникновение запроса (а тем более нескольких) может быть нежелательным);
5. выбрать исходя из других соображений.
PS: знаю, что теоретически можно исправить 1 букву (букву диска) в строке адреса, но:
1. В неё нельзя попасть, если весь путь в ней не помещается;
2. Действие с кнопкой быстрее;
3. В случае реализации перехода в похожую папку, эти действия не будут эквивалентны.