Webサービスに次のコードがあります。
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);
文字列を返します。
発信者は、パス全体を含むファイル名を保存しようとしたときにエラーが発生したことを発見したことがわかります。実際に、このエラーを取得するには、ファイル名に":"
があれば十分です。ファイル名に":"
が含まれている可能性がある場合(たとえば、ファイル名に日付スタンプがある場合)、これらを別のものに置き換えてください。つまり:
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());
私にとって、問題は人間の目には見えない""
左から右への埋め込み 文字です。
。
var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Works
var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Error
したがって、これらは一見同一ですが、実際には2行が異なります。
このエラーを引き起こす可能性のある他のものの中で:
完全な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
この問題を防ぐ1つの方法は、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
解決策は、Resolve-Path
によって返されるオブジェクトでProviderPath
プロパティを使用することです。
> 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 メソッドを使用すると役立ちますか?ファイルパスを結合するより安全な方法です。パスの結合に問題がある可能性があります
SSISでファイルのアーカイブを作成するために、単純なファイルシステムタスクで使用する変数の(制限付きの)式ビルダーを使用しています。
これは、コロンを削除してエラーを停止するための迅速で汚いハックです:@ [User :: LocalFile] + "-" + REPLACE((DT_STR、30、1252)GETDATE()、 ":"、 "-")+ 「.xml」
値がfile:// C:/ whateverなどのファイルURLの場合、Uriクラスを使用して通常のファイル名に変換します。
var localPath = (new Uri(urlStylePath)).AbsolutePath
一般に、提供されたAPIを使用するのがベストプラクティスです。