3

私は現在、XML メッセージを取得してアーカイブし、さらに処理する Web サービスに取り組んでいます。アーカイブ フォルダーは、Web.config から読み取られます。アーカイブ方法はこんな感じ

private void Archive(System.Xml.XmlDocument xmlDocument)
{
    try
    {
        string directory = System.Configuration.ConfigurationManager.AppSettings.Get("ArchivePath");

        ParseMessage(xmlDocument);

        directory = string.Format(@"{0}\{1}\{2}", directory, _senderService, DateTime.Now.ToString("MMMyyyy"));
        System.IO.Directory.CreateDirectory(directory);

        string Id = _messageID;
        string senderService = _senderService;

        xmlDocument.Save(directory + @"\" + DateTime.Now.ToString("yyyyMMdd_") + Id + "_" + System.Guid.NewGuid().ToString().Substring(0, 13) + ".xml");
    }

取得するパス構造は C:\Program Files\Subfolder\Subfolder です。開発、QA、UAT、および PRD 環境では、すべて正常に動作します。しかし、Web サービスをインストールする必要がある別のマシン (残念ながらデバッグできません) では、ディレクトリ文字列は「C:Files」です。念のため、別のマシンで .NET のバージョンを再確認しました (おそらく、文字列の前の @ の使用はバージョンに依存していると思いました)。すべてのマシンが 2.0.50727 を使用します。

誰もこの問題を認識していますか?

前もって感謝します!

編集: ディレクトリ変数の前に @ が表示され、私が尋ねた質問に関して混乱が生じました。それは@についてではありませんでした(実際、そこにあるはずはありませんでした。私はそれを削除しました)。

私の質問 (言い換え) は、@"c:\folder\subfolder" のように、引用符で囲まれた文字列の前に @ を配置すると、バックスラッシュがエスケープ文字として解釈されないことが保証されますよね? あるマシンでは動作するが、別のマシンでは動作しない原因は何ですか? (ちなみにPath.Combineを使用するという回答には同意します。この一貫性のない動作の原因は何なのか知りたいです)

4

4 に答える 4

7

String.Format()の代わりに Path.Combine( )を使用してみてください。良い例はここにあります

于 2010-04-27T15:11:26.207 に答える
0

構成ファイルから値が取得されると、自動的に適切にエスケープされます。ディレクトリ変数名の「@」記号は、それを「明示的」に設定していません-名前付きパラメーターであることをコンパイラーに伝えています。例えば:

public void (string[] args)
{
   int length = args.Length;
   length = @args.Length; // Same thing!
}

変数名の「@」演算子は、その記号を予約語として扱わないことを意味します。キーワードと同じ名前の変数名を作成できます。

public static void Foo(object @class)
{
     //@class exists here, even though class is a reserved keyword!
} 

さらに、取得する値が「C:Files」の場合、「\」がないため無効です。「C:\Files」は有効です。

于 2010-04-27T15:19:45.157 に答える
0

たとえば、Path.Combine() を使用します。

strFilename = CombinePaths(directory, _senderService) + DateTime.Now.ToString("MMMyyyy");
于 2010-04-27T15:21:42.150 に答える
0

あなたの質問から、私はあなたが扱ったと思います:

@directory

以下と同じ機能を実行したかのように:

@"c:\myfolder\"

違いは、最初の例では @class のような予約語を変数名として使用できること (使用する習慣を身につけないでください) と、2 番目の例では文字列に などのエスケープされていない文字を含めることができることです。

于 2010-04-27T15:26:25.800 に答える