2010-04-27 1 views
3

В настоящее время я работаю над веб-службой, которая извлекает XML-сообщение, архивирует его и затем обрабатывает его дальше. Папка архива считывается из Web.config. Это то, что метод архив выглядитC# - получить путь к файлу из файла конфигурации - @ не делает это волшебство

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 \ подпапка \ подпапка. В средах разработки, QA, UAT и PRD все работает нормально. Но на другом компьютере мне теперь нужно установить веб-службу (к сожалению, я не могу отлаживать), строка каталога - «C: Файлы». Просто, чтобы убедиться, что я дважды проверил версию .NET на разных компьютерах (я думал, возможно, использование @ до того, как строка зависела от версии); все машины используют 2.0.50727.

Кто-нибудь знает эту проблему?

Заранее благодарен!

EDIT: Я вижу @ до того, как переменная каталога вызвала некоторую путаницу в отношении вопроса, который я задал. Дело не в этом @ (на самом деле этого не должно было быть, я его удалил).

Мой вопрос (перефразированный): , когда вы помещаете @ перед цитируемой строкой, например @ "c: \ folder \ subfolder", это гарантирует, что обратные косые символы не будут интерпретироваться как escape-символы, не так ли? Что может быть причиной того, что он работает на одной машине, но не работает над другой? (я согласен с ответами, заявив использовать Path.Combine, кстати. Я просто любопытно, что вызывает это противоречивое поведение)

+1

Я уверен, что префикс @ для строки обрабатывается компилятором C#, а не средой выполнения. Кроме того, при построении строк пути вы должны использовать 'System.IO.Path.Combine'. –

+0

Префикс переменной с помощью @ просто позволяет создавать имя переменной с зарезервированными ключевыми словами (@return, @break и т. Д.). Не путайте с @, чтобы префикс строковых литералов. –

ответ

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' будет действительным.

+0

Отсутствует более одного '\'. Значение «C: \ Program Files \ подпапка \ подпапка» сводится к «C: Files». т. Е. Каждое слово с «\» перед ним опущено: «\ Program» и все подпапки «\ подпапка». – Bart

0

Использование Path.Combine(), например:

strFilename = CombinePaths(directory, _senderService) + DateTime.Now.ToString("MMMyyyy"); 
0

Из вашего вопроса я думаю, что вы лечение:

@directory 

Как будто она выполняла ту же функцию:

@"c:\myfolder\" 

Разница в том, что в первом примере вы можете использовать зарезервированное слово в качестве имени переменной, например @class (не попадайте в привычка использовать его), а второй пример позволяет содержать строки, не содержащие экранов, например.

Смежные вопросы