Хэш-символ в пути создает исключение DirectoryNotFoundException - PullRequest
1 голос
/ 21 октября 2008

Рассмотрим следующий фрагмент кода

private void ProcessFile(string fullPath) {
    XmlTextReader rdr = new XmlTextReader("file:\\\\" + fullPath);
    while (rdr.Read()) {
        //Do something
    }
    return;
}

Теперь, это нормально работает, когда передается путь вроде:

"C: \ Work Files \ Technical Information \ Dummy.xml"

Но выдает ошибку при прохождении

"C: \ Work Files \ #Техническая информация \ Dummy.xml"

Обратите внимание, что все указанные папки и файлы существуют и что хеш-символ является допустимым символом для путей. Детали ошибки:

System.IO.DirectoryNotFoundException: Не удалось найти часть пути 'C: \ Work Files \'.
в System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath)
at System.IO.FileStream.Init (Строковый путь, режим FileMode, доступ FileAccess, права Int32, логическое использование useRights, общий доступ к FileShare, опции3232 bufferSize, опции FileOptions, SECURITY_ATTRIBUTES secAttrs, строка msgPath, логический bFromProxy)
в System.IO.FileStream..ctor (путь строки, режим FileMode, доступ к FileAccess, общий доступ к FileShare, размер буфера Int32)
at System.Xml.XmlDownloadManager.GetStream (Uri uri, учетные данные ICredentials)
at System.Xml.XmlUrlResolver.GetEntity (Uri absoluteUri, строковая роль, тип объекта ObjectToReturn)
at System.Xml.XmlTextReaderImpl.OpenUrlDelegate (Object xmlResolver)
в System.Threading.CompressedStack.runTryCode (Object userData)
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, код возврата CleanupCode, объект userData объекта)
в System.Threading.CompressedStack.Run (CompressedStackressedStack, обратный вызов ContextCallback, состояние объекта)
в System.Xml.XmlTextReaderImpl.OpenUrl ()
в System.Xml.XmlTextReaderImpl.Read ()
в System.Xml.XmlTextReader.Read ()

Кто-нибудь знает, что происходит?

Ответы [ 3 ]

4 голосов
/ 21 октября 2008

Добавление к ответу Конрада, если вы используете протокол file: //, вам нужно использовать% 23 для #, тогда он отлично работает

2 голосов
/ 21 октября 2008

Попробуйте пропустить префикс протокола file:///. Это работает для меня без одного. Я считаю, что .NET будет усекать любую часть после #, если считает, что это URL. Это только предположение, основанное на сообщении об ошибке, но кажется логичным, учитывая, что часть после символа # обрабатывается не сервером, а клиентом в других сценариях (например, веб-браузерах).

0 голосов
/ 21 октября 2008

Почему бы вам не использовать

XmlTextReader rdr = новый XmlTextReader (fullPath);

...