Не удается скопировать файлы в Environment.SpecialFolder.Startup в WPF

Чтобы мое приложение запускалось в Windows sturup, я решил поместить ярлык в папку «Автозагрузка».

Я пытался использовать:

File.Move(AppDomain.CurrentDomain.BaseDirectory + "ApplicationName.exe", Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "ApplicationName.lnk");

Работает, но перемещает мой ярлык не в ту папку, которая мне нужна.

Environment.GetFolderPath(Environment.SpecialFolder.Startup)

работает хорошо, он возвращает:

C:\Users\Germanov\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Но мой ярлык появляется в

C:\Users\Germanov\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

Всего 1 папка "позади".

File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "ApplicationName.lnk");

тоже работает "странно". Он фактически удаляет этот файл, но опять же не в папке «Автозагрузка».

Если я попытаюсь вручную добавить «\ Startup» к пути следующим образом:

Environment.GetFolderPath(Environment.SpecialFolder.Startup) + @"Startup\ApplicationName.lnk"

Я получаю System.IO.Excseption.

Я не могу ввести этот путь вручную, мне нужно, чтобы мое приложение работало на разных ПК с разными версиями Windows. Я также не могу использовать реестр, чтобы мое приложение запускалось при запуске Windows.

Я использую Windows 7, Visual Studio 2010, .NET 4.0, это проект WPF.

Любые идеи?


person Pavlo Hermanov    schedule 22.07.2011    source источник
comment
Опубликуйте код, который вы используете для создания ярлыка, пожалуйста.   -  person Security Hound    schedule 22.07.2011
comment
Я взял это отсюда: stackoverflow.com/ вопросы/234231/   -  person Pavlo Hermanov    schedule 22.07.2011


Ответы (2)


Вы пробовали Environment.SpecialFolder.CommonStartup вместо Startup, я не знаю, почему запуск не работает для вашего требования. Большинство установочных пакетов делают это за вас; почему вы хотите сделать это для себя? Есть ли причина не использовать реестр?

Я попробовал этот код на своей машине

var startup = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup);
string file = Path.Combine(startup, "MyApp.lnk");
using (StreamWriter sw = new StreamWriter(file))
{
sw.WriteLine("Test");
}

И это приближается к моему стартапу

введите здесь описание изображения

person Anuraj    schedule 22.07.2011
comment
У CommonStartup та же проблема. Он копирует файл в C:\ProgramData\Microsoft\Windows\Start Menu\Programs. - person Pavlo Hermanov; 22.07.2011
comment
У CommonStartup та же проблема. Он копирует файл в C:\ProgramData\Microsoft\Windows\Start Menu\Programs. Я хочу сделать это вручную, чтобы дать пользователям возможность выключать и включать эту функцию. Я не хочу использовать реестр, потому что доступ к нему может быть заблокирован для разных пользователей. - person Pavlo Hermanov; 22.07.2011
comment
Посмотрите мою папку «Автозагрузка» в меню «Пуск» - person Anuraj; 22.07.2011
comment
Большое спасибо, ваш код работает хорошо. Я использовал File.Copy() вместо StreamWriter, и файл появился в правильной папке. Я думаю, что речь идет о Path.Combine(), но я не понимаю, как это работает. Спасибо еще раз. - person Pavlo Hermanov; 22.07.2011
comment
Добро пожаловать. Сделай ответ :) - person Anuraj; 22.07.2011
comment
Есть ли причина не использовать реестр? ВТФ? С какой стати вам рыться в реестре, когда есть задокументированный, поддерживаемый API, который делает именно то, что вам нужно? (А с меньшим количеством кода?) - person Joe White; 22.07.2011

Вы должны использовать System.IO.Path.Combine(), чтобы не создавать StartupApplication1.exe. Обратите внимание на отсутствие обратной косой черты.

person Hans Passant    schedule 22.07.2011