"Формат данного пути не поддерживается."
у меня есть следующий код в мой веб-сервиса:
string str_uploadpath = Server.MapPath("/UploadBucket/Raw/");
FileStream objfilestream = new FileStream(str_uploadpath +
fileName, FileMode.Create, FileAccess.ReadWrite);
может кто-нибудь помочь мне решить проблему с этим сообщением об ошибке из строки 2 кода.
формат данного пути не поддерживается.
разрешение на папку установлено на полный доступ ко всем, и это фактический путь к папке.
точка останова дала мне значение str_uploadpath как C:webprojectswebservicesUploadBucketRaw.
что в этом плохого струна?
8 ответов:
вместо
str_uploadpath + fileName, попробуйте использоватьSystem.IO.Path.Combineвместо:Path.Combine(str_uploadpath, fileName);который возвращает строку.
Я вижу, что создатель обнаружил, что ошибка произошла при попытке сохранить имя файла со всем путем. На самом деле достаточно иметь
":"в имя файла, чтобы получить эту ошибку. Если там может быть":"в имени файла (например, если у вас есть штамп даты в имени файла) убедитесь, что вы замените их чем-то другим. Т. е.:string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Если вы пытаетесь сохранить файл в файловой системе. Путь.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());
среди прочего, что может вызвать эту ошибку:
вы не можете иметь определенные символы в полной строке файла пути.
например, эти символы будут аварийно завершать работу функции 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.надеюсь, это спасет кого-то от головной боли...!
если вы получаете эту ошибку в 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
Это была моя проблема, которая может помочь кому-то еще-хотя это не было проблемой ОП:
DirectoryInfo diTemp = new DirectoryInfo(strSomePath); FileStream fsTemp = new FileStream(diTemp.ToString());Я определил проблему, выведя свой путь к файлу журнала и обнаружив, что он не форматируется правильно. Исправить для меня было довольно просто:
DirectoryInfo diTemp = new DirectoryInfo(strSomePath); FileStream fsTemp = new FileStream(diTemp.FullName.ToString());
не с помощью путь.Комбайн способ помочь? Это более безопасный способ объединения путей к файлам вместе. Может быть, у него проблемы с соединением путей вместе
Comments