web-dev-qa-db-ja.com

「指定されたパスの形式はサポートされていません。」

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\\としてくれました。

この文字列の何が問題になっていますか?

91
All Blond

str_uploadpath + fileNameを使用するのではなく、代わりに System.IO.Path.Combine を使用してください。

Path.Combine(str_uploadpath, fileName);

文字列を返します。

112
user586399

発信者は、パス全体を含むファイル名を保存しようとしたときにエラーが発生したことを発見したことがわかります。実際に、このエラーを取得するには、ファイル名に":"があれば十分です。ファイル名に":"が含まれている可能性がある場合(たとえば、ファイル名に日付スタンプがある場合)、これらを別のものに置き換えてください。つまり:

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

ファイルをファイルシステムに保存しようとしている場合。 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());
18
ThiagoPXP

私にとって、問題は人間の目には見えない"‪"左から右への埋め込み 文字です。

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

したがって、これらは一見同一ですが、実際には2行が異なります。

8
Oleg Grishko

このエラーを引き起こす可能性のある他のものの中で:

完全な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.

これが誰かの頭痛の種を救うことを願っています...!

7
Michael Herman

変更してみてください:

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

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

2
JimSTAT

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
2
Aaron Jensen

これは私の問題であり、他の誰かを助けるかもしれません-それはOPの問題ではありませんでした:

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

パスをログファイルに出力し、正しくフォーマットされていないことを確認して、問題を特定しました。私にとって正しいことは非常に簡単でした:

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

Path.Combine メソッドを使用すると役立ちますか?ファイルパスを結合するより安全な方法です。パスの結合に問題がある可能性があります

1
Kurru

SSISでファイルのアーカイブを作成するために、単純なファイルシステムタスクで使用する変数の(制限付きの)式ビルダーを使用しています。

これは、コロンを削除してエラーを停止するための迅速で汚いハックです:@ [User :: LocalFile] + "-" + REPLACE((DT_STR、30、1252)GETDATE()、 ":"、 "-")+ 「.xml」

0
Adam Noël

値がfile:// C:/ whateverなどのファイルURLの場合、Uriクラスを使用して通常のファイル名に変換します。

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

一般に、提供されたAPIを使用するのがベストプラクティスです。

0
Chris Bordeman