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


103

Webサービスに次のコードがあります。

string str_uploadpath = Server.MapPath("/UploadBucket/Raw/");
FileStream objfilestream = new FileStream(str_uploadpath +
                fileName, FileMode.Create, FileAccess.ReadWrite);

誰かがコードの2行目のこのエラーメッセージの問題を解決するのを手伝ってくれませんか。

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

フォルダーのアクセス許可は、すべてのユーザーにフルアクセスできるように設定されており、フォルダーへの実際のパスです。

ブレークポイントによって、str_uploadpathas の値がわかりましたC:\\webprojects\\webservices\\UploadBucket\\Raw\\

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


の価値はfileName何ですか?
ジャスティン

fileName空っぽのように聞こえます。
ジェレミー・マギー

ジャスティン、あなたは正しかった。ファイル名の値の名前にC:/が含まれていました。それは私を殺していたものです。ありがとう。
ブロンド

回答:


125

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

Path.Combine(str_uploadpath, fileName);

文字列を返します。


エラーが発生しました:エラー4 using名前空間ディレクティブは名前空間にのみ適用できます。'System.IO.Path'は名前空間ではないタイプです
All Blond

2
@All Blondをusing System.IO;上に配置してから、クリアstr_uploadpath + fileNameして書き込むPath.Combine(str_uploadpath, fileName)

コードは以下のようになり、同じエラー:指定されたパスの形式はサポートされていません。string str_uploadpath = Server.MapPath(@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine(str_uploadpath、fileName); FileStream objfilestream = new FileStream(str_uploadpath、FileMode.Create、FileAccess.ReadWrite);
ブロンド

1
@Allはコードをデバッグしようとします。エラーの原因となる行(Visual StudioではF9)の直前の行にブレークポイントを設定します。プログラムを実行します。プログラムがブレークポイントで停止したら、変数の上にマウスを置きますstr_uploadpath。その価値は何ですか?

1
次のパスでサポートされていないパスを取得しています、なぜですか?「C:\ Users \ Admin \ AppData \ Local \ Adob​​e \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf」エクスプローラーに貼り付けると、うまく開きますが、 NETのSystem.IO.File.ReadAllBytesメソッドがそのエラーをスローします。それは確かに有効で正確なパスですが、なぜエラーですか?
Triynko 2012

51

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

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

2
これにより、ファイル名に関する問題が修正されました。現在の日付と時刻をファイルに追加しています。「:」の値が原因で、プログラムが参照するエラーOPをスローしていました。
acedanger 2013

1
これは、私Path.GetInvalidPathCharsがそうPath.GetInvalidFileNameCharsであったように、を使用することでよく発生します。
Sep

4
ありがとうございました!これが、複数の回答を投稿することが常に良い考えである理由です。
Nick

31

私にとっての問題は、人間の目には見えない"‪" から右への埋め込み文字でした。
文字列の先頭( 'D'の直前)で、Windowsファイルのプロパティの[セキュリティ]タブからパスをコピーして貼り付けた後、スタックしました。

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

つまり、一見すると同じですが、2つの線は実際には異なります。


21

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

またはさらに短いreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub

7

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

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.

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


ああありがとう!名前にISO日付文字列を含むファイルを保存していましたが、不正な ":"が含まれています!ありがとう!
メイソン

3

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

2

変更してみてください:

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

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


URLには通常スラッシュがあり、MapPathどちらの方法でもそれを理解できるほど賢いです。
ジャスティン

@spender @文字列の前にそれらをエスケープするがあります。
ジャスティン

2

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

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

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

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

1

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


0

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

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


0

今日も同じ問題がありました。コードにロードしようとしていたファイルは、Excelで編集するために開かれていました。Excelを閉じた後、コードが機能し始めました!


-1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.