在 Visual Studio 中为 C# 更新 App.Config 文件的最佳方法是啥? [复制]

Posted

技术标签:

【中文标题】在 Visual Studio 中为 C# 更新 App.Config 文件的最佳方法是啥? [复制]【英文标题】:What is the best way to update an App.Config file for C# in Visual Studio? [duplicate]在 Visual Studio 中为 C# 更新 App.Config 文件的最佳方法是什么? [复制] 【发布时间】:2020-03-17 19:42:03 【问题描述】:

我一直在使用 Visual Studio 2019 在 C# 中进行文件转换项目。有人要求我修改我的代码,以便将任何文件路径替换为通过 App.Config 文件调用的变量。我是这种方法的新手,因为我以前从未被教过如何做到这一点。如果有人可以提供帮助,我正在寻找一些指导或示例。我已经尝试过任何相关的文章或视频,但仍在苦苦挣扎。我的代码如下。我已将所有服务/数据库名称更新为通用名称。提前致谢。

    class Program

    static void Main(string[] args)
    

        string fromPath = string.Empty;
        string toPath = string.Empty;

        // set path where the source xls file is
        string sourcePath = @"\\server\Data\subfolder\subfolder2\";

        // determine target filename from today's date
        string sourceFile = DateTime.Now.ToString("MM.dd.yy") + ".xls";

        // determine if the target file exists
        fromPath = sourcePath + sourceFile;              // gives us the full path and filename to open

        if (System.IO.File.Exists(fromPath))
        
            // file exists, so process it

            // make our output file
            toPath = sourcePath + "import.csv";

            // do the conversion to csv
            CsvHelper csv = new CsvHelper();
            csv.XlsToCsv(fromPath, toPath);

            // renames one column to say 'idn_prod1'
            var file1 = @"\\server\Data\subfolder\subfolder2\import.csv";
            var lines = System.IO.File.ReadAllLines(file1);

            var columnHeaders = lines[0];
            var textToReplace = "idn_prod";
            var newText = "idn_prod1";

            var indexToReplace = columnHeaders
                .LastIndexOf("idn_prod");//LastIndex ensures that you pick the second idn_prod
            columnHeaders = columnHeaders
                .Remove(indexToReplace, textToReplace.Length)
                .Insert(indexToReplace, newText);//removes the second idn_prod and replaces it with the updated value.

            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file1))
            
                sw.WriteLine(columnHeaders);

                foreach (var str in lines.Skip(1))
                
                    sw.WriteLine(str);
                

                sw.Flush();
            



            // archive xls file to prevent buildup in this directory
            if (Directory.Exists(@"\\server\Data\subfolder\subfolder2\"))
            
                foreach (var file in new DirectoryInfo(@"C:\Users\myName\Documents\Projects\").GetFiles())
                
                    file.MoveTo($@" @"\\server\Data\subfolder\subfolder2\Archive"\file.Name");
                
            



        



    
    //Move data in CSV file to a DataTable
    private static System.Data.DataTable GetDataTabletFromCSVFile(string csv_file_path = @"\\server\Data\subfolder\subfolder2\import.csv")
    
        System.Data.DataTable csvData = new System.Data.DataTable();
        try
        
            using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
            
                csvReader.SetDelimiters(new string[]  "," );
                csvReader.HasFieldsEnclosedInQuotes = true;
                string[] colFields = csvReader.ReadFields();
                foreach (string column in colFields)
                
                    DataColumn datecolumn = new DataColumn(column);
                    datecolumn.AllowDBNull = true;
                    csvData.Columns.Add(datecolumn);
                
                while (!csvReader.EndOfData)
                
                    string[] fieldData = csvReader.ReadFields();
                    //Making empty value as null
                    for (int i = 0; i < fieldData.Length; i++)
                    
                        if (fieldData[i] == "")
                        
                            fieldData[i] = null;
                        
                    
                    csvData.Rows.Add(fieldData);
                
            
        
        catch (Exception ex)
        
            return null;
        
        return csvData;
    

    //import DataTable into Server and database table
    static void InsertDataIntoSQLServerUsingSQLBulkCopy(System.Data.DataTable csvFileData)
    
        using (SqlConnection dbConnection = new SqlConnection("Data Source=server;Initial Catalog=Database;Integrated Security=SSPI;"))
        
            dbConnection.Open();
            using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
            
                s.DestinationTableName = "Table";
                foreach (var column in csvFileData.Columns)
                    s.ColumnMappings.Add(column.ToString(), column.ToString());
                s.WriteToServer(csvFileData);
            
        
    

下面是我目前的 App.Config。很抱歉之前的问题。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" 
    sku=".NETFramework,Version=v4.5.2" />
        </startup>
      <appSettings>
        <!-- Name of the application-->
        <add key="ApplicationName" value="xlsTocsv"/>

        <!-- Archive directory for XLS files-->
        <add key="MoveTo" 
    value="@\\server\Data\subfolder\subfolder2\Archive"/>

        <!-- Server Name for import-->
        <add key="Data Source" value="Server"/>
      </appSettings>
    </configuration>

【问题讨论】:

您说您看过视频和文章,但仍在苦苦挣扎,但您没有提及原因。如果您没有确切地告诉我们您遇到了什么问题,我们可能会尝试在此处复制您已经查看过的所有内容,但仍然无法改善您的情况。 如果您尝试过某些东西,请发布您尝试过的代码并指出您遇到的问题。然后我们可以提供帮助。在您发布的代码中,我没有看到 App.config 在任何地方使用。 您在这里遇到的具体问题是什么? ***.com/questions/1189364/… @itsme86 - 抱歉,我很挣扎,因为我不确定更新我的 App.Config 的最佳方式,所以在实际程序中事情看起来并不那么硬编码。 【参考方案1】:

在 Visual Studio 中:

    右键单击您的项目, 选择添加->新建项目。 在搜索框中,输入“配置”。 选择“应用程序配置项”。这会将样板 XML 文件添加到名为“App.config”的项目中 添加一个&lt;appSettings&gt;&lt;/appSettings&gt; 元素作为主&lt;configuration&gt; 节点的直接子节点 在 appSetting 元素中,创建如下所示的子元素:
<add key="someKey" value ="Some value as a string, it could be a number, or whatever"/>
    如果没有,请在您的项目中添加对 System.Configuration 的引用。

    在您要访问应用设置的每个文件中,将using System.Configuration; 添加到文件顶部。

    要获取设置,请使用如下代码:

var someKeySetting = ConfigurationManager.AppSettings["someKey"];

此时,someKeySetting 将是一个字符串,其中包含您在配置文件中提供的设置。如果配置文件中不存在该设置,则someKeySetting 将是null。如果您想使用数字、日期或枚举,则必须解析生成的字符串(最好使用适当的 TryParse 调用。

【讨论】:

【参考方案2】:

您将希望将您的值放入 app.config 文件中,就像这样

<configuration> //this is probably already in your app.config file
  <appSettings>
    <add key="variable1Name" value="/mypathgoeshere/example" />
    ....
  </appSettings>
</configuration>

要访问这些变量,您需要这些

命名空间:System.Configuration

程序集:System.Configuration.dll, System.Configuration.ConfigurationManager.dll

然后在你的文件中你想像这样访问它。

using System.Configuration;     

    public class Program
    
        public static void Main()
        
            string configvalue1 = ConfigurationManager.AppSettings["variable1Name"];
            //returns the value of "/mypathgoeshere/example"
        
    

【讨论】:

谢谢!这绝对有帮助。 不客气,很高兴它有帮助。

以上是关于在 Visual Studio 中为 C# 更新 App.Config 文件的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有多个子项目的 Visual Studio 中为 C# 解决方案设置通用值(抽象)?

如何在 Visual Studio 2019 中为 C# WPF 切换 XAML 中的行注释

在 Visual Studio 2010 C++ 中为 /// 生成 XML 文档注释

如何在 Visual Studio 2017 中为 Linux 应用启用多线程

在 html 中为 Visual Studio 中的 Angular 静态键入

如何使用 C++ 非托管库在 Visual Studio 2017 中为 Xamarin.Forms 设置项目?