Почему для изменения файлов требуется UAC?

Я создал приложение с ini-файлом и db.mdb (доступ), и оно загружает некоторые изображения из Интернета в папку, которая находится рядом с приложением.

Ну, я создал установочный файл с помощью Setup Factory Software. Все выглядит довольно хорошо, и я запустил свое приложение, и оно не изменяет значение ini-файла, не загружает изображения и не вставляет какой-либо отчет в БД.

Вот путь моего приложения, C:\Program Files (x86)\XXXXXXX

вот код входящей строки в дб

public void AddChannels(List<MediaChannel> list)
{

 string connectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=data\\db.mdb;";
 try
 {
  using (OleDbConnection connection = new OleDbConnection(connectionString))
  {
   OleDbCommand cmd = new OleDbCommand();
   cmd.Connection = connection;

   connection.Open();


   int tmp1;
   string tmpstr;
   foreach (var mediaChannel in list)
   {
    tmp1 = mediaChannel.ImagePath.LastIndexOf('/');
    tmpstr = mediaChannel.ImagePath.Substring(tmp1+ 1, mediaChannel.ImagePath.Length - tmp1 - 1);

    cmd.CommandText = "Insert Into Channels(ChannelName,CategoryName,Url,ImagePath,ChannelType) values(@ChannelName,@CategoryName,@Url,@ImagePath,@ChannelType)";
       cmd.Parameters.AddWithValue("@ChannelName", mediaChannel.Name);
       cmd.Parameters.AddWithValue("@CategoryName", mediaChannel.CategoryName);
       cmd.Parameters.AddWithValue("@Url", mediaChannel.Url);
       cmd.Parameters.AddWithValue("@ImagePath", tmpstr);
       cmd.Parameters.AddWithValue("@ChannelType", (int)mediaChannel.ChannelType);
       cmd.ExecuteNonQuery();
      cmd.Parameters.Clear();
   }
  connection.Close();
 }
} 
catch (Exception ex)
{

throw new Exception(ex.Message);
}
}

и вот мой метод загрузки изображений

private void DownloadLogo()
{

string localFilename = Application.StartupPath + @"\Imgs\";
if (!Directory.Exists(localFilename))
Directory.CreateDirectory(localFilename);

foreach (var mediaChannel in channelList)
{

string imgName = mediaChannel.ImagePath;
if (imgName.Contains("http://"))
{
int tmp1 = mediaChannel.ImagePath.LastIndexOf('/');
imgName = mediaChannel.ImagePath.Substring(tmp1 + 1, mediaChannel.ImagePath.Length - tmp1 - 1);

}


if (!File.Exists(localFilename + imgName))
{


using (var client = new WebClient())
{

client.DownloadFile(mediaChannel.ImagePath, localFilename + imgName);
}
}
}
}

Все выглядит хорошо, и у меня никогда не возникало такого рода проблем. Если я запускаю программу от имени администратора, она работает...

Еще одна вещь, я открыл свою базу данных, которая находится в C:\Program Files (x86)\XXXXXXX\data, я использовал MS Access и интересно, я не могу редактировать таблицу. Он говорит мне, что вам нужно сохранить как файл для изменения.. Я думаю, что программные файлы (86) защищены UAC. Моя ОС - Windows 8 Professional.

Может быть, программа установки делает это так? Поскольку я не могу использовать визуальную студию из-за ограниченной лицензии на установку щита, я использовал приложение третьей стороны.

Итак, как решить эту проблему? Мой клиент ждет, чтобы я решил эту проблему..

3 ответа

Решение

Вам, вероятно, нужно использовать папку AppData вместо папки Program Files. Проверьте этот похожий вопрос Сохранение файла в данные приложения в C#

Вы пытаетесь изменить файл в Program Files, Это область файловой системы, которая не предназначена для изменяемых данных приложения - в основном она предназначена только для чтения. Подозрительные изменения в этой области, следовательно, подсказка UAC.

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

Наконец я решил, в чем проблема.. Я дал разрешения на запись в мои файлы, и все в порядке.

http://www.indigorose.com/webhelp/suf9/Program_Reference/Actions/File.SetPermissions.htm

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