Msgstr "Формат данного пути не поддерживается." - PullRequest
91 голосов
/ 08 сентября 2011

В моем веб-сервисе есть следующий код:

string str_uploadpath = Server.MapPath("/UploadBucket/Raw/");
FileStream objfilestream = new FileStream(str_uploadpath +
                fileName, FileMode.Create, FileAccess.ReadWrite);

Может кто-нибудь помочь мне решить проблему с помощью этого сообщения об ошибке из строки 2 кода.

Формат данного пути не поддерживается.

Разрешение для папки установлено на полный доступ для всех, и это фактический путь к папке.

Точка останова дала мне значение str_uploadpath как C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Что не так с этой строкой?

Ответы [ 11 ]

113 голосов
/ 08 сентября 2011

Вместо того, чтобы использовать str_uploadpath + fileName, попробуйте вместо этого System.IO.Path.Combine:

Path.Combine(str_uploadpath, fileName);

, которая возвращает строку.

42 голосов
/ 17 октября 2012

Я вижу, что отправитель обнаружил, что произошла ошибка при попытке сохранить имя файла с полным путем.На самом деле достаточно иметь ":" в имени файла, чтобы получить эту ошибку.Если в вашем имени файла может быть ":" (например, если в имени файла есть отметка даты), убедитесь, что вы заменили их чем-то другим.Т.е.:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
18 голосов
/ 30 июля 2015

Если вы пытаетесь сохранить файл в файловой системе. Path.Combine не является пуленепробиваемым, поскольку он не поможет вам, если имя файла содержит недопустимые символы. Вот метод расширения, который удаляет недопустимые символы из имен файлов:

public static string ToSafeFileName(this string s)
{
        return s
            .Replace("\\", "")
            .Replace("/", "")
            .Replace("\"", "")
            .Replace("*", "")
            .Replace(":", "")
            .Replace("?", "")
            .Replace("<", "")
            .Replace(">", "")
            .Replace("|", "");
    }

И использование может быть:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
10 голосов
/ 02 декабря 2018

Для меня проблема была невидима для человеческого глаза "‪" Слева направо символ.
Он застрял в начале строки (непосредственно перед буквой «D») после того, как я скопировал и вставил путь, из вкладки безопасности свойств файла Windows.

var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Works
var yourJson = System.IO.File.ReadAllText(@"‪D:\test\json.txt"); // Error

Так что те, на первый взгляд идентичные, две строки на самом деле разные.

7 голосов
/ 04 октября 2014

Среди прочего, что может вызвать эту ошибку:

В полной строке PathFile не может быть определенных символов.

Например, эти символы будут вызывать сбой функции StreamWriter:

"/"  
":"

могут быть и другие спецсимволы, которые его тоже сбивают. Я обнаружил, что это происходит, когда вы пытаетесь, например, поместить штамп DateTime в имя файла:

AppPath = Path.GetDirectoryName(giFileNames(0))  
' AppPath is a valid path from system. (This was easy in VB6, just AppPath = App.Path & "\")
' AppPath must have "\" char at the end...

DateTime = DateAndTime.Now.ToString ' fails StreamWriter... has ":" characters
FileOut = "Data_Summary_" & DateTime & ".dat"
NewFileOutS = Path.Combine(AppPath, FileOut)
Using sw As StreamWriter = New StreamWriter(NewFileOutS  , True) ' true to append
        sw.WriteLine(NewFileOutS)
        sw.Dispose()
    End Using

Один из способов предотвратить эту проблему - заменить проблемные символы в NewFileOutS на доброкачественные:

' clean the File output file string NewFileOutS so StreamWriter will work
 NewFileOutS = NewFileOutS.Replace("/","-") ' replace / with -
 NewFileOutS = NewFileOutS.Replace(":","-") ' replace : with - 

' after cleaning the FileNamePath string NewFileOutS, StreamWriter will not throw an (Unhandled) exception.

Надеюсь, это спасет кого-то от головной боли ...!

2 голосов
/ 10 января 2017

Это была моя проблема, которая может помочь кому-то еще, хотя это была не проблема ОП:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.ToString());

Я определил проблему, выведя мой путь к файлу журнала и обнаружив, что он неправильно форматирует. Правильно для меня было довольно просто:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.FullName.ToString());
2 голосов
/ 25 октября 2012

Если вы получаете эту ошибку в PowerShell, скорее всего, потому что вы используете Resolve-Path для разрешения удаленного пути, например,

 Resolve-Path \\server\share\path

В этом случае Resolve-Path возвращает объект, который при преобразовании в строку не возвращает действительный путь. Возвращает внутренний путь PowerShell:

> [string](Resolve-Path \\server\share\path)
Microsoft.PowerShell.Core\FileSystem::\\server\share\path

Решение состоит в том, чтобы использовать свойство ProviderPath для объекта, возвращаемого Resolve-Path:

> Resolve-Path \\server\share\path | Select-Object -ExpandProperty PRoviderPath
\\server\share\path
> (Resolve-Path \\server\share\path).ProviderPath
\\server\share\path
2 голосов
/ 08 сентября 2011

Попробуйте изменить:

Server.MapPath("/UploadBucket/Raw/")

на

Server.MapPath(@"\UploadBucket\Raw\")

1 голос
/ 08 сентября 2011

Помогает ли использование метода Path.Combine ? Это более безопасный способ объединения путей к файлам. Возможно, у него проблемы с объединением путей

0 голосов
/ 16 октября 2018

Я использую (ограниченный) конструктор выражений для переменной для использования в простой задаче файловой системы для создания архива файла в SSIS.

Это мой быстрый и грязный хак для удаления двоеточийчтобы остановить ошибку: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"

...