FTP操作を実行するc#.Netコンソールアプリがあります。現在、カスタム構成セクションで設定を指定しています。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="ftpConfiguration" type="FileTransferHelper.FtpLibrary.FtpConfigurationSection, FileTransferHelper.FtpLibrary" />
</configSections>
<ftpConfiguration>
<Environment name="QA">
<sourceServer hostname="QA_hostname"
username="QA_username"
password="QA_password"
port="21"
remoteDirectory ="QA_remoteDirectory" />
<targetServer downloadDirectory ="QA_downloadDirectory" />
</Environment>
</ftpConfiguration>
</configuration>
コマンドラインで外部設定ファイルを指定したいと思います。
しかしながら!!!...
上記の「FtpConfiguration」セクションは、実際にはアプリケーションのapp.configに属していません。私の最終的な目標は、次のようにコンソールアプリを実行する多くのスケジュールされたタスクを持つことです。
FileTransferHelper.exe -c FtpApplication1.config
FileTransferHelper.exe -c FtpApplication2.config
...
FileTransferHelper.exe -c FtpApplication99.config
その結果、間違ったパスをたどり、本当に欲しいのはカスタムxmlドキュメントで読み取るものですが、System.Configurationを使用して値を取得し続けることです... XmlDocumentを読み取ってシリアル化するのではなくノード/要素/属性を取得します。 (ただし、誰かが私に簡単なコードを見せてくれれば、私は後者に反対しません)
ポインタをいただければ幸いです。ありがとう。
更新:私が受け入れた答えは、別のStackOverflow質問へのリンクであり、ここで私のコードで繰り返しました-以下は私が探していたものです-OpenMappedExeConfigurationを使用して外部設定ファイルを開きます
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = @"D:\Development\FileTransferHelper\Configuration\SampleInterface.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
FtpConfigurationSection ftpConfig = (FtpConfigurationSection)config.GetSection("ftpConfiguration");
System.Configurationを使用してカスタムファイルを開く場合は、この投稿を確認することをお勧めします。カスタム構成ファイルの読み込み。オリバーは非常に簡単な方法でそれを釘付けします。
コマンドラインを介してアプリケーションに渡されたパラメーターを読み取りたいため、このMSDNの投稿にアクセスしてください:Command Line Parameters Tutorial。
カスタムアプローチを使用する場合は、いくつかの方法があります。 1つの可能性は、ローダークラスを実装し、カスタム構成ファイルを使用することです。
たとえば、次のような単純な構成ファイルを想定します。
spec1.config
<?xml version="1.0" encoding="utf-8"?>
<Settings>
<add key="hostname" value="QA_hostname" />
<add key="username" value="QA_username" />
</Settings>
非常にシンプルな、ハッシュテーブルのような(キーと値のペア)構造。
実装されたパーサー/リーダーは次のようになります。
private Hashtable getSettings(string path)
{
Hashtable _ret = new Hashtable();
if (File.Exists(path))
{
StreamReader reader = new StreamReader
(
new FileStream(
path,
FileMode.Open,
FileAccess.Read,
FileShare.Read)
);
XmlDocument doc = new XmlDocument();
string xmlIn = reader.ReadToEnd();
reader.Close();
doc.LoadXml(xmlIn);
foreach (XmlNode child in doc.ChildNodes)
if (child.Name.Equals("Settings"))
foreach (XmlNode node in child.ChildNodes)
if (node.Name.Equals("add"))
_ret.Add
(
node.Attributes["key"].Value,
node.Attributes["value"].Value
);
}
return (_ret);
}
その間、ConfigurationManager.AppSettings[]
を使用して元のapp.config
ファイルから読み取ることができます。
カスタムパスを使用する場合、正直なところ、JSONを使用して設定を保存し、デシリアライズしてロードし、シリアル化して書き込みます。 Json.NET を使用すると、これを非常に簡単に行うことができます。
あなたのXML:
<ftpConfiguration>
<Environment name="QA">
<sourceServer hostname="QA_hostname"
username="QA_username"
password="QA_password"
port="21"
remoteDirectory ="QA_remoteDirectory" />
<targetServer downloadDirectory ="QA_downloadDirectory" />
</Environment>
</ftpConfiguration>
JSONでは次のようになります。
{
"FtpConfiguration": {
"Environment": {
"Name": "QA",
"SourceServer": {
"HostName": "QA_hostname",
"UserName": "QA_username",
"Password": "QA_password",
"Port": "21",
"RemoteDirectory": "QA_remoteDirectory"
},
"TargetServer": {
"DownloadDirectory": "QA_downloadDirectory"
}
}
}
}
クラスは次のようになります。
class Config
{
public FtpConfiguration FtpConfiguration { get; set; }
}
class FtpConfiguration
{
public Environment Environment { get; set; }
}
class Environment
{
public SourceServer SourceServer { get; set; }
public TargetServer TargetServer { get; set; }
}
class SourceServer
{
public string HostName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int Port { get; set; }
public string RemoteDirectory { get; set; }
}
class TargetServer
{
public string DownloadDirectory { get; set; }
}
次のようなオブジェクトに設定を保存します。
var config = new Config()
{
FtpConfiguration = new FtpConfiguration()
{
Environment = new Environment()
{
SourceServer = new SourceServer()
{
HostName = "localhost",
UserName = "jaxrtech",
Password = "stackoverflowiscool",
Port = 9090,
RemoteDirectory = "/data",
},
TargetServer = new TargetServer()
{
DownloadDirectory = "/downloads"
}
}
}
};
次に、このようなファイルにwrite(または、より大きなファイルの場合はStream
を使用)できます:
string json = JsonConvert.SerializeObject(config);
File.WriteAllText("config.json", json);
次に、このようなファイルでreadを使用できます(代わりにStream
を使用できます)。
string json = File.ReadAllText("config.json");
Config config = JsonConvert.DeserializeObject<Config>(json);
私が推奨するソリューションはXDocumentを使用します。私はそれをテストしていませんので、若干の問題があるかもしれませんが、これは私のポイントを示すためです。
public Dictionary<string, string> GetSettings(string path)
{
var document = XDocument.Load(path);
var root = document.Root;
var results =
root
.Elements()
.ToDictionary(element => element.Name.ToString(), element => element.Value);
return results;
}
フォームのxmlから要素名と値を含む辞書を返します:
<?xml version="1.0" encoding="utf-8"?>
<root>
<hostname>QA_hostname</hostname>
<username>QA_username</username>
</root>
全体的に簡潔であるため、このソリューションは素晴らしいと思います。
繰り返しますが、これがそのまま正確に機能するとは考えていません。 XAttributesやXElementsなどを使用すると、これを間違いなくオリジナルに近づけることができます。フィルタリングは簡単です。