С как получить путь к загрузкам
Перейти к содержимому

С как получить путь к загрузкам

  • автор:

Как определить путь к папке загрузки 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»

  1. 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», то что ты дальше с этим будешь делать? И как это тебе поможет установить реальный пусть запуска твоей программы?

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *