"Файл не найден" при копировании файла с русскими символами или пробелами в пути

Рейтинг: 0Ответов: 1Опубликовано: 15.02.2023

Изначальный путь к файлу: C:\Users\101\Pictures\Снимок экрана 2023-02-15 115721.png Получаю путь к файлу от пользователя с помощью

var dialog = new Microsoft.Win32.OpenFileDialog();
var PickedFilePath = new Uri(System.IO.Path.GetFullPath(dialog.FileName));

В PickedFilePath.AbsolutePath в итоге лежит такой путь: C:\Users\101\Pictures\%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-02-15%20115721.png и при попытке выполнить копирование

var fileExt = Path.GetExtension(PickedFilePath.AbsolutePath);
Directory.CreateDirectory(Globals.ImagesPath);
var file = new FileInfo(PickedFilePath.AbsolutePath);
file.CopyTo(Globals.ImagesPath + "\\" + "copy" + fileExt, true);

получаю ошибку

Файл 'C:\Users\101\Pictures%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-02-15%20115721.png' не найден.

Тоже самое происходит, если в пути есть пробелы. Сначала заменял через .Replace('%20', " "), но с русскими символами делать такого не вижу смысла, должны же быть другие пути?

При копировании файлов только с английскими символами или цифрами без пробелов в пути все копируется без ошибок. Как копировать файлы с русскими символами и пробелами в пути? Может строку PickedFilePath можно форматировать какой-то встроенной функцией?

Ответы

▲ 2Принят

Нужно либо раскодировать строку перед использованием, убрать URL Encoding

var file = new FileInfo(Uri.UnescapeDataString(PickedFilePath.AbsolutePath));

Либо не использовать Uri.

var PickedFilePath = dialog.FileName; // dialog.FileName возвращает абсолютный путь
var file = new FileInfo(PickedFilePath);

Кстати, научитесь использовать Path.Combine

file.CopyTo(Path.Combine(Globals.ImagesPath, "copy" + fileExt), true);