Почему File.OpenRead() добавляет относительный путь к исполняемому файлу?

Почему при использовании следующего кода

string filePath = @"‪C:\test\upload.pdf"
FileStream fs = File.OpenRead(filePath);

вызывает следующее исключение?

The filename, directory name, or volume label syntax is incorrect : 
'C:\ConsoleApp\bin\Debug\netcoreapp2.1\‪‪C:\test\upload.pdf'

Откуда взялся каталог C:\ConsoleApp\bin\Debug\netcoreapp2.1\‪‪?

Обновлять:File.OpenRead() в моем случае существует в dll, а filePath (C:\test\upload.pdf) отправляется через приложение, использующее dll.

File.OpenRead ничего подобного не делает. Сообщите код, который фактически воспроизводит проблему, и отправьте полный текст исключения, включая стек вызовов. Вы можете получить это легко с Exception.ToString()
Panagiotis Kanavos 29.05.2019 09:51

нет необходимости. File.OpenRead — настолько фундаментальный вызов, что каждый разработчик .NET Core заметил бы проблему. Очевидно, что строка не является допустимым путем. Наиболее вероятной причиной могут быть недопустимые или невидимые символы или символы, похожие на : или \ .

Panagiotis Kanavos 29.05.2019 09:57

Поместите курсор на " из "C:\. Нажмите вправо несколько раз. Что (странное) вы заметили? Если вы этого не заметите, попробуйте еще раз. Еще один способ обнаружить такого рода проблемы — проверить длину строки. При любом странном поведении строк проверьте их длину перед дальнейшим исследованием. Невидимые символы по своей природе трудно увидеть, но они влияют на длину.

mjwills 29.05.2019 10:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
712
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Строка начинается с невидимого символа, поэтому это недопустимый путь. Этот

(int)@"‪C:\test\upload.pdf"[0]

Возвращает

8234

Или шестнадцатеричный 202A. Это знак препинания ВНЕДРЕНИЕ СЛЕВА НАПРАВО

ОБНОВИТЬ

Рэймонд Чен опубликовал статью Почему в начале имени моего файла есть невидимая буква U+202A?.

We saw some time ago that you can, as a last resort, insert the character U+202B (RIGHT-TO-LEFT EMBEDDING) to force text to be interpreted as right-to-left. The converse character is U+202A (LEFT-TO-RIGHT EMBEDDING), which forces text to be interpreted as left-to-right.

The Security dialog box inserts that control character in the file name field in order to ensure that the path components are interpreted in the expected manner. Unfortunately, it also means that if you try to copy the text out of the dialog box, the Unicode formatting control character comes along for a ride. Since the character is normally invisible, it can create all sorts of silent confusion.

(We’re lucky that the confusion was quickly detected by Notepad and the command prompt. But imagine if you had pasted the path into the source code to a C program!)

Спустя 4 года после этой статьи Блокнот получил поддержку UTF8, поэтому символ не заменен знаком вопроса. Вставка в текущую консоль Windows с ее неполной поддержкой UTF8 по-прежнему заменяет символ.

@Bogdan Doicin: самый 1-й символ (ВСТАВКА СЛЕВА НАПРАВО, с кодом 0x202A), который является невидимый, неверен. Перепечатайте "C: фрагмент

Dmitry Bychenko 29.05.2019 09:57

@BogdanDoicin нет, я говорю, что нить неверен с самого начала. Где ты взял эту строку? Это пришло из текстового поля справа налево? Кто-то на самом деле Добавить символ там?

Panagiotis Kanavos 29.05.2019 09:58

@PanagiotisKanavos Я бы искал целую вечность. Вот оно. Вы все описали выше. Я скопировал путь из свойств файла в windows

OrElse 29.05.2019 10:06

@OrElse вы найдете много вопросов ТАК, где проблема была вызвана невидимыми символами или странными комбинациями, такими как ... как один символ или, что еще хуже, , то есть запятая-пробел как один символ Unicode в файле CSV

Panagiotis Kanavos 29.05.2019 10:09

File.OpenRead() в моем случае существует в dll.

Установите CopyLocal= true в свойствах dll, в которой существует File.OpenRead.

Ошибка не имеет ничего общего с существованием. File.OpenRead обрабатывает строку так, как будто это не путь. Любая другая функция будет делать то же самое, потому что это нет допустимый путь - он начинается с невидимого символа.

Panagiotis Kanavos 29.05.2019 10:00

Другие вопросы по теме