"Данный формат пути не поддерживается".

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

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\\.

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

Ответ 1

Вместо использования str_uploadpath + fileName попробуйте вместо System.IO.Path.Combine:

Path.Combine(str_uploadpath, fileName);

который возвращает строку.

Ответ 2

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

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];

Ответ 3

Если вы пытаетесь сохранить файл в файловой системе. 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());

Ответ 4

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

У вас не может быть определенных символов в полной строке 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.

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

Ответ 5

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

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

к

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

Ответ 6

Если вы получите эту ошибку в 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

Ответ 7

Это была моя проблема, которая может помочь кому-то другому - хотя это не проблема OP:

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

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

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

Ответ 8

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

Ответ 9

Если значение является файлом url like file://C: /whatever, используйте класс Uri для перевода на обычное имя файла:

var localPath = (new Uri(urlStylePath)).AbsolutePath

В общем, использование предоставленного API - лучшая практика.

Ответ 10

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

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

Ответ 11

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

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

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