Как определить путь к папке загрузки Windows?
Но на компьютере коллег этой папки не существует, а его папка «Загрузки» находится в его папке «Мои документы». Мы оба на Windows 7*.
*Редактировать: на самом деле, оказывается, он запускал приложение не на своем компьютере, а на компьютере с Windows Server 2003.
папка «Загрузки» локализована. для неанглоязычных систем это не называется «Загрузки» . — Adrien Plisson
3 ответы
Windows не определяет CSIDL для папки «Загрузки» и недоступен через Environment.SpecialFolder перечисление.
Однако новая Vista Известная папка API определяет его с идентификатором FOLDERID_Downloads . Вероятно, самый простой способ получить фактическое значение — это P / invoke SHGetKnownFolderPath .
Обратите внимание, что P / invoke, указанный на pinvoke.net, неверен, так как он не использует набор символов Unicode. Также я воспользовался тем фактом, что этот API возвращает память, выделенную распределителем COM. Маршаллинг по умолчанию для P / invoke, приведенный выше, заключается в освобождении возвращенной памяти с помощью CoTaskMemFree что идеально подходит для наших нужд.
Будьте осторожны, это API Vista и выше, и не пытайтесь вызывать его на XP / 2003 или ниже.
ответ дан 06 окт ’11, 11:10
в Windows 7 папка «Загрузки» — это специальная папка, поэтому я могу переместить ее в любое конкретное место, которое захочу. Точно так же, как вы можете переместить папку Мои документы и т. Д. — Даан Тиммер
@ Даан Нет CSIDL для этого, так что в этом нет ничего особенного. — Дэвид Хеффернан
@Daan Но он определяется как известная папка. Я искал в старом списке CSIDL. — Дэвид Хеффернан
кажется правдой, но, тем не менее, известен как KNOWNFOLDERID: msdn.microsoft.com/en-us/library/dd378457(v=VS.85).aspx FOLDERID_Загрузки редактировать похоже, вы уже нашли / ответили на эту часть. — Даан Тиммер
@Daan Да, известные папки заменили CSIDL, который, насколько я понимаю, теперь устарел. — Дэвид Хеффернан
Получение папки Загрузки в C#? [дубликат]
Я сделал код, который будет искать каталоги и отображать файлы в списке.
Я даже попытался это:
I получите ошибку, хотя.
Ок, где написано UsersHunter Ну, когда люди получают мое программное обеспечение, есть имя не Хантер. так как мне сделать это, где он идет в папку загрузки любого пользователя?
6 ответов
метод WinAPI SHGetKnownFolderPath это единственный правильный способ получить пути к специальным папкам, включая личные и папку Загрузки.
есть и другие способы получить аналогичные результаты, которые выглядят многообещающими, но заканчиваются просто совершенно неправильными путями в конкретных системах (например, объединение или жесткое кодирование частей пути или злоупотребление старым ключом реестра). Причина этого изложена в моя статья CodeProject, что также дается полное решение. Он предоставляет класс упаковки с поддержкой извлечения всех известных 94 специальных папок и некоторых других лакомств.
для быстрого примера здесь я просто вставил сокращенную версию решения, имея возможность извлекать только личные специальные папки, такие как загрузки:
(полностью прокомментированная версия находится в статье CodeProject, связанной выше.)
пока это был просто неприятный стене код, поверхность нужно разобраться с этим довольно просто. Вот пример консольной программы, выводящей путь к папке Downloads.
Е. Г., просто позвоните KnownFolders.GetPath() С KnownFolder enum значение папки, путь к которой вы хотите запросить.
Пакет NuGet
если вы не хотите проходить через все это, просто установите мой пакет NuGet, который я недавно создал. Вот сайт проекта, а вот галерея ссылке (Примечание что использование различно и отполировано, пожалуйста советуйте с разделом использования на месте проекта для Больше информации).
самый простой способ сделать это:
Если вам нужно только получить путь к папке Загрузки текущего пользователя, вы можете использовать это:
Лучший способ получить путь к папке приложения
Я вижу, что есть несколько способов получить путь к папке приложения:
- Application.StartupPath
- System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
- AppDomain.CurrentDomain.BaseDirectory
- System.IO.Directory.GetCurrentDirectory()
- Environment.CurrentDirectory
- System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
- System.IO.Path.GetDirectory(Application.ExecutablePath)
Каков наилучший способ в зависимости от ситуации?
9 ответов
AppDomain.CurrentDomain.BaseDirectory , вероятно, наиболее полезен для доступа к файлам, местоположение которых относительно каталога установки приложения.
В приложении ASP.NET это будет корневой каталог приложения, а не подпапка bin — это, вероятно, то, что вы обычно хотите. В клиентском приложении это будет каталог, содержащий основной исполняемый файл.
В приложении VSTO 2005 это будет каталог, содержащий управляемые сборки VSTO для вашего приложения, а не, скажем, путь к исполняемому файлу Excel.
Другие могут возвращать разные каталоги в зависимости от вашей среды — например, см. ответ @Vimvq1987.
CodeBase — это место, где был найден файл, и может быть URL-адресом, начинающимся с http://. В этом случае Location , вероятно, будет кешем загрузки сборки. CodeBase не может быть установлен для сборок в GAC.
Обратите внимание, что не все из этих методов возвратят одно и то же значение. В некоторых случаях они могут возвращать одинаковое значение, но будьте осторожны, их цели различны:
возвращает параметр StartupPath (может быть установлен при запуске приложения)
возвращает текущий каталог, который может быть или не быть папкой, в которой находится приложение. То же самое касается Environment.CurrentDirectory . Если вы используете это в DLL файле, он вернет путь, где выполняется процесс (это особенно верно в ASP.NET).
Application.StartupPath и 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) — будет работать только для приложение Windows Forms
Я собираюсь дать вам что-то вроде: «C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101» , где находится страница, на которой вы работаете.
AppDomain.CurrentDomain.BaseDirectory для веб-приложения может быть полезным и вернет что-то вроде «C:\\hg\\Services\\Services\\Services.Website\\» , которое является базовым каталогом и весьма полезно.
System.IO.Directory.GetCurrentDirectory() и 5. Environment.CurrentDirectory
предоставит вам местоположение, откуда был запущен процесс, поэтому для веб-приложения, работающего в режиме отладки, из Visual Studio что-то вроде «C:\\Program Files (x86)\\IIS Express»
- System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
получит ваше местоположение, где .dll , на котором запущен код, для веб-приложения, которое может быть «file:\\C:\\hg\\Services\\Services\\Services.Website\\bin»
Теперь в случае, например, точки приложения консоли 2-6 будут находиться в каталоге, где находится .exe файл.
C++ получить путь до запущенного бинарного файла
Как в c++ получить путь текущей папки из которой программа была запущена? Желательно стандартными средствами, что бы было платформо-независимым.


кстати «путь до запущенного бинарного файла» != «путь текущей папки из которой программа была запущена», для первого смотри readlink + /proc/self/exe, GetModuleFileName и пр., т.к. нет кроссплатформенного решения

а argv разве не кроссплатформенное решение?

В argv ты можешь найти всё, что угодно, вместо реальной команды запуска программы.

Да, кроссплатформенное имя исполняемого файла для доступа из _текущей_ папки.

Читать man 3 exec. Вдумчиво. До просветления.

Вы имеете ввиду что если бинарник положить в /usr то argv будет возвращать «ничто»?

вообщем объясните доходчиво, чем грозит использование argv?

Я имею ввиду что запускаемой программе можно передать любой бред в argv[0]. Осиль уже прочитать ман.

ну можно же проверку на слеши сделать, точнее взять то что закрыто в слеши

Посмотри в сторону языков более высокого уровня, например Java. Ты же не драйвер пишешь!

Ты тупой? Если программа, делающая exec твоей программы, сказала, что твоя программа зовётся «VasyaDurak», то что ты дальше с этим будешь делать? И как это тебе поможет установить реальный пусть запуска твоей программы?

А мне и не надо название проги, я его и так знаю и укажу, мне надо название директорий начиная от той папки в которой запустилась прога.