Ответ 1
Вместо использования str_uploadpath + fileName
попробуйте вместо System.IO.Path.Combine
:
Path.Combine(str_uploadpath, fileName);
который возвращает строку.
У меня есть следующий код в моем веб-сервисе:
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\\
.
Что не так с этой строкой?
Вместо использования str_uploadpath + fileName
попробуйте вместо System.IO.Path.Combine
:
Path.Combine(str_uploadpath, fileName);
который возвращает строку.
Я вижу, что создатель обнаружил, что произошла ошибка при попытке сохранить имя файла со всем путем. На самом деле достаточно получить ":"
в имени файла, чтобы получить эту ошибку. Если в имени файла может быть ":"
(например, если у вас есть отметка даты в имени вашего файла), обязательно замените их на что-то еще. I.e:
string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Если вы пытаетесь сохранить файл в файловой системе. 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());
Среди прочего, которые могут вызвать эту ошибку:
У вас не может быть определенных символов в полной строке 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.
Надеюсь, это избавит кого-то от головных болей...!
Попробуйте изменить:
Server.MapPath("/UploadBucket/Raw/")
к
Server.MapPath(@"\UploadBucket\Raw\")
Если вы получите эту ошибку в 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
Это была моя проблема, которая может помочь кому-то другому - хотя это не проблема OP:
DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.ToString());
Я решил проблему, выведя свой путь к файлу журнала и обнаружив, что он не форматирует правильно. Правильно для меня было довольно просто:
DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.FullName.ToString());
Использует ли метод Path.Combine метод? Это более безопасный способ объединения путей файлов. Возможно, это связано с тем, что проблемы связаны между собой путями
Если значение является файлом url like file://C: /whatever, используйте класс Uri для перевода на обычное имя файла:
var localPath = (new Uri(urlStylePath)).AbsolutePath
В общем, использование предоставленного API - лучшая практика.
Я использую (ограниченный) построитель выражений для Variable для использования в простой файловой системе Task для создания архива файла в SSIS.
Это мой быстрый и грязный хак, чтобы удалить двоеточия, чтобы остановить ошибку: @[User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE(), ":", "-") + ".xml"
Для меня проблема была невидимым для человеческого глаза ""
Вправо-вправо ".
Он застрял в начале строки (непосредственно перед "D") после того, как я скопировал путь, со вкладки безопасности свойств файла Windows.
var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Works
var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Error
Таким образом, те, что на первый взгляд идентичны, две линии на самом деле разные.