C# 为什么更改文件需要UAC?

C# 为什么更改文件需要UAC?,c#,installation,uac,program-files,administrative,C#,Installation,Uac,Program Files,Administrative,我创建了一个具有ini文件和db.mdb访问权限的应用程序,它将一些图像从web下载到应用程序附近的文件夹中 我用setup Factory软件创建了一个安装文件。一切似乎都很好,我启动了我的应用程序,它不会改变ini文件的值,不会下载图像,也不会向db插入任何记录 这是我的应用程序的路径,C:\ProgramFilesx86\XXXXXXX 这是安装行到db的代码 public void AddChannels(List<MediaChannel> list) { string

我创建了一个具有ini文件和db.mdb访问权限的应用程序,它将一些图像从web下载到应用程序附近的文件夹中

我用setup Factory软件创建了一个安装文件。一切似乎都很好,我启动了我的应用程序,它不会改变ini文件的值,不会下载图像,也不会向db插入任何记录

这是我的应用程序的路径,C:\ProgramFilesx86\XXXXXXX

这是安装行到db的代码

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);
}
}
一切看起来都很好,我从来没有遇到过这样的问题。如果我以管理员的身份运行我的程序,它会工作

还有一件事,我打开了我的数据库,它位于C:\ProgramFilesx86\XXXXXXX\data中 我用的是MS Access,很有趣,我不能编辑表格。它告诉我您需要保存为您的文件以进行更改。。我认为程序文件86受UAC保护。我的操作系统是Windows8专业版

也许是安装程序造成的?由于install shield安装程序的许可证有限,我无法使用visual studio安装程序,因此我使用了第三方setup maker应用程序


那么,如何解决这个问题呢?我的客户正在等待我解决此问题。

您正在尝试修改程序文件中的文件。这是文件系统的一个领域,它不是为可变的应用程序数据而设计的——它基本上是只读的。对该区域的修改是可疑的,因此UAC提示


您应该通过将数据存储在文件系统中更合适的位置来解决此问题。具体位置将取决于您的应用程序尝试执行的操作。它是一项服务,还是仅仅是一个本地客户端应用程序?这些数据是针对登录用户的,还是针对计算机范围的?

您可能需要使用AppData文件夹而不是Program Files文件夹。
检查这个类似的问题

最后我解决了问题所在。。 我给了我的文件写权限,一切正常


谢谢你的解释,我完全理解,我需要做的是Radenko Zec的解决方案谢谢你Radenko的回答,这正是我想要的答案。正如Matthew所说,为了在所有用户之间共享数据库,ProgramData看起来更好,对吗?是否需要像UAC这样的文件夹?AppData文件夹是特定于每个用户的,因此只有在您希望每个用户都有一个单独的数据库文件时才使用它。如果要在所有用户之间共享数据库文件,则需要改用ProgramData。@ertan2002您不需要UAC来访问ProgramData下的文件夹。谢谢@MatthewWatson,我将使用此文件夹,但我不知道XP用户是否拥有它,我希望这对他们来说不会有问题:@ertan2002:您应该使用它来获取基本文件夹:string dataFolder=Environment.GetFolderPathEnvironment.SpecialFolder.CommonApplicationData;它应该在XP和Windows7或Windows8下获得正确的路径。然后在下面创建一个特定于应用程序的文件夹,并在其中安装数据库文件。
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);
}
}
}
}