0

我想将我当前使用的设置文件迁移到 appconfig 文件。目前我正在尝试制作它的副本,但到目前为止,我什至无法使用配置管理器将其写入文件。

我需要做的是首先创建文件然后写入它,最后它已经存在,更新它!看起来很简单,但到目前为止它在每一个转折点上都让我望而却步。到目前为止我提到的所有材料都假设它存在。甚至 MS MCTS 参考书也已经为示例制作了一个配置文件。

假设您有足够的权限,是否有一种编程方式来创建它,然后写入应用程序的默认 bin 文件夹。

这些示例使这看起来很简单,但是当您查看有问题的文件上的时间戳时......抓挠他的头......帽子掉了!

我的意思是它们是不同类型的配置文件吗?我知道 web.config 和 app.config 但人们真的偏离了这个简单的命名模板有多少???

感谢您的任何回复。伊布拉

4

5 回答 5

5

首先,你说app.config的是一个配置文件。它不是。它是 Visual Studio 中的源文件,VS 使用它在编译期间创建配置文件。在编译期间,如果 Visual Studio 检测到 app.config,它会将其复制到编译的输出文件夹并将其重命名为(假设程序集的完全限定名称是NameSpace.your.applicationName),

NameSpace.your.applicationName.exe.config

那是您应该查找的文件,并在您正在编写的任何自定义代码中读取/写入。

正如其他答案所述,请小心执行此操作。这不是微不足道的。此文件只是 CLR 用来管理应用程序配置的完整系统的一部分,您很容易将其搞砸。

最后,请调查名为configSource. 使用它,您可以在 app.config 中放置一个元素,该元素“重定向”配置系统以在单独的文件中查找特定配置部分。您可以通过修改 app.config 中的 section 元素来使用它,如下所示:

<MyConfigSectionName configSource="ConfigFolder\MySpecConfigFile.xml" />

或者,将现有的 .Net 配置部分移动到单独的文件中,

<appSettings configSource="ConfigFolder\MyAppSettings.xml" />

然后,您可以创建一个单独的配置文件,其中包含您想要的设置,然后打开、读取和写入该文件......

MyAppSettings.xml 文件的内容:

<?xml version="1.0" encoding="utf-8" ?>

<appSettings>
  <add key="limitToSingleInstance" value="true"/>
  <add key="maximumCacheFiles" value="1000"/>
  <add key="maximumThreadCount" value="5"/>
</appSettings>
于 2009-12-09T14:59:46.697 回答
1

这是一个示例,说明如何创建自定义配置文件,存储一些配置数据,然后将其与一些 if exists 语句一起读回以在需要时创建它。希望将它翻译成 C# 不会那么麻烦。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + "\Settings.Config") Then
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", OpenMode.Random, OpenAccess.ReadWrite)
        FileGet(1, SettingVar1, 1)
        FileGet(1, SettingVar2, 2)
        FileGet(1, SettingVar3, 3)
        'etc
        FileClose(1)
    Else
        FileOpen(1, System.IO.Directory.GetCurrentDirectory() + "\Settings.Config", Openmode.Random, OpenAccess.ReadWrite)
        FilePut(1, "Static Setting to write", 1) 'insert a string
        FilePut(1, 3, 2) 'insert a number
        FilePut(1, New DBMC, 3) 'Any object
        'etc...
        FileClose(1)
    End If
End Sub

应该注意的是,.NET 有一个内置的设置文件,VB 可以引用(My.Settings),它可以做同样的事情,但没有通过代码管理文件的开销。还有用于保存设置变量的注册表(如果您有勇气并承诺在卸载程序时清理注册表),以及许多其他正确的方法。

另外,请注意,许多开发人员不赞成使用随机访问文件,并且由于与大型随机访问文件相关的某些开销成本,它们通常不再使用太多。但是,为了简单起见,随机访问文件是一种非常容易理解的创建和控制配置文件的方法。

于 2009-12-09T15:21:16.257 回答
1

得到它的工作。

1)首先将配置文件添加到您的项目中。

2) 将其命名或重命名为 application-like-for-like 的名称。

3) 确保它以 .config 结尾

4)设置配置文件的属性,以便将其复制到输出文件夹。

5) 确保您的项目正确引用项目引用下的配置程序集。

6)像这样创建配置对象,例如:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

--> 暂时在枚举对象上使用“None”...稍后针对不同的用户等进行实验。

7) 调试您的项目并运行几次,以确保配置对象正确获取配置文件,并且其文件路径属性正确指向配置文件的位置。所以在运行时这将在 \bin\debug\ .... -----> 检查 has ffile 属性并确保它也是真的。

8)在这个阶段,配置对象已正确设置并准备就绪。现在添加您的条目​​,就像您使用键值对概念将条目添加到 Hashtable 或 Dictionary 中一样。

config.AppSettings.Settings.Add("Key", "Value");

9) 一旦你添加了一些示例测试数据,最后要做的就是保存配置。

config.Save();

10) 最后,导航到构建输出文件夹并检查文件配置文件是否已更改。

更新:您可能会发现最终在输出目录中的 vshost.exe 文件可能会搞砸,因为我注意到我的配置对象指向这些 xml 文件之一,而不是我的配置文件。在 VS IDE 之外,这没问题,因为 vhsost 文件没有部署也没有使用,但在 IDE 中,它很高兴让它在那里工作。所以如果发生这种情况,请关注我下面的帖子。

这就是我或多或少在寻找的答案......无论如何,感谢我收到的所有回复。

于 2009-12-14T17:35:40.587 回答
0

我自己对配置文件摸不着头脑。最后,我选择简单地创建自己的设置类,并根据需要(反)将其序列化为 XML 到/从磁盘。

序列化您自己的设置文件的注意事项:

  • 更灵活
  • 您必须编写更多代码
  • 类型安全(指按类型而不是字符串 ID 设置)

当然还有很多其他的考虑,但第三个是我最喜欢的。

于 2009-12-09T14:49:38.337 回答
0

尽管这不是答案,而是上一篇文章的后续。

private void saveAllMenuItem_Click(object sender, EventArgs e)
    {
        // Set up the config object .... with a default user level.
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        if (isWindowsDriveSet())
        {
            // Save the drive name and write it to a config file.
            config.AppSettings.Settings.Add("Drive", WindowsDrive());
        }
        else
        {
            MessageBox.Show("Please set your windows drive before proceeding!", "Windows Drive Not Set!",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        if (ShowHiddenFilesSetting()) // only true (executes) if the app is showing 'ALL' files.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());
        }
        else // else default is implied.
        {
            config.AppSettings.Settings.Add("FileSettings", FileSettings());            
        }

        // Notify the user that the method has completed successfully.
        toolStripStatusLabel.Text = "Settings saved.";

        // Log to the logger what has just happened here.
        ActionOccured(this, new ActionOccuredEventArgs("0", DateTime.Now.ToString(), "The user has saved his settings."));

        // Finally save to the config.
        config.Save();
    }

以上是我保存应用程序设置的“Save()”方法。虽然我确实设法让它工作......我发现在每次构建测试和擦拭我的区域后,我发现我的应用程序会自动查找“MyFileExplorer.config”,而是查找 vshost.exe.config 文件某种。我不知道它为什么要寻找这个文件?由于 filePath 属性是访问器属性,因此我无法更改它的值。

我将进一步试验,看看我是否可以让它再次工作!

于 2009-12-15T12:25:50.300 回答