Как определить, какую папку просматривал пользователь при вызове моей программы, из меню "Отправить"?

Я положил ярлык для моего приложения в SendTo. Теперь я могу выбрать некоторые файлы в Проводнике и отправить их в свое приложение. Но как я могу получить путь, где находятся файлы? Моя программа должна создать новый файл в родительском каталоге, общий для всех полученных имен файлов.

Например, если у меня есть эти файлы:

C:\ one.txt
C:\1\

Я выбираю файл one.txt и каталог 1 в проводнике. Как я могу узнать, что начальный каталог для этих файлов - C:\?

Я знаю, что могу использовать ParamStr() чтобы получить пути к файлам, но что тогда? Я мог бы попытаться получить общий каталог для всех файлов, передаваемых моему приложению, но если я выберу в C:\ каталоги 1 и 2, и эти каталоги будут выглядеть так:

C:\ 1 \4 \ 5 \ one.txt
C:\1\4 \ two.txt

Тогда начальный каталог - C:\ 1 \4.

2 ответа

Решение

До Windows 7 все файлы, выбранные в Проводнике, всегда находились в одном и том же каталоге, поэтому легко узнать, какой каталог просматривал пользователь. Это так же, как каталог любого одного файла. использование ExtractFilePath для этого.

Начиная с Windows 7, однако, Explorer позволяет размещать каталоги в группы, называемые библиотеками. Все файлы из всех папок отображаются вместе в одном представлении. Пользователи могут выбирать файлы из нескольких каталогов и отправлять их все в вашу программу одновременно. Представление не представляет никакой реальной директории на диске, поэтому заданный здесь вопрос не имеет смысла.

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

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

Я думаю, что я просто возьму все имена файлов, переданные моей программе через ParamStr, и использую эту функцию: http://delphi.about.com/od/delphichallengesexercises/qt/delphi-extract-base-path-challenge.htm чтобы найти общие базовый путь, который должен быть путем вызова SendTo.

Другие вопросы по тегам