给定路径的格式不受支持。

122

我在我的 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 \\ 给了我。

这个字符串有什么问题吗?


fileName 的值是什么? - Justin
似乎 fileName 是空的。 - Jeremy McGee
Justin,你是对的。文件名中的值包含了C:/。这就是让我出错的原因。谢谢。 - All Blond
13个回答

140

建议使用System.IO.Path.Combine而非str_uploadpath + fileName

Path.Combine(str_uploadpath, fileName);

这会返回一个字符串。


2
@所有人:在代码顶部加入 using System.IO;,然后清除 str_uploadpath + fileName,并写成 Path.Combine(str_uploadpath, fileName) - user586399
1
@所有人都要尝试调试你们的代码。在导致错误的那一行的前一行上设置断点(在Visual Studio中按F9)。运行程序。当程序停在断点处时,将鼠标悬停在变量“str_uploadpath”上。它的值是多少? - user586399
根据Justin的评论,我查看了文件名的值。清理了文件名以获取绝对文件名,因为实际值包含了文件路径。然后按照他建议的将其与路径结合起来。这对我很有用。谢谢。 - All Blond
1
我在以下路径上遇到了“路径不受支持”的问题,为什么?“C:\Users\Admin\AppData\Local\Adobe\Flash CS6\en_US\Configuration\CodeModel\cm-cache\SwcCache\basemovie3.swc1272273593\library.swf”。如果我在资源管理器中粘贴它,它可以正常打开,但.NET的System.IO.File.ReadAllBytes方法会抛出该错误。这绝对是一个有效和准确的路径,那么为什么会出现错误? - Triynko
@Desolator 在我的情况下,代码在本地运行良好,但在服务器上却出现了相同的错误。 - Meer
显示剩余5条评论

64

我看到原作者发现当试图保存带有完整路径的文件名时出现了错误。实际上,只要文件名中含有":"就会出现此错误。如果您的文件名中可能会有":"(例如,如果您的文件名中有日期戳),请确保将这些字符替换为其他字符。例如:

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

4
这个修复了我文件名的问题。我将当前日期和时间附加到我的文件名中,其中 ":" 的值导致我的程序抛出 OP 所提到的错误。 - acedanger
1
这种情况经常发生在使用 Path.GetInvalidPathChars 而不是 Path.GetInvalidFileNameChars 的时候,就像我的情况一样。 - Seph
6
谢谢!这就是为什么发布多个答案总是一个好主意的原因。 - Nick

52

对我来说,问题是一个人眼看不见的"‪"从左到右嵌入字符。在我从Windows文件属性安全选项卡中复制粘贴路径后,它卡在字符串开头(就在'D'之前)。

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

所以,那两条看起来相同的线实际上是不同的。


在我的情况下,我已经执行了$@"D:\test\json{dateTimeValue}.txt",当然这会被翻译成09/04/2020 - John Zabroski
哈!我还以为那个对话框很有用呢,让我可以复制文件的完整路径...谢谢! - Markus Bruckner
谢谢。我花了很长时间才找到这个。 - argoo

24
如果您想将文件保存到文件系统中,Path.Combine并不是万无一失的,因为它不能帮助您排除文件名中包含的无效字符。以下是一个扩展方法,从文件名中删除无效字符:

如果您试图将文件保存到文件系统中。 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

9

除了其他可能导致此错误的原因外:

您不能在完整的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.

希望这能为某些人省去一些麻烦...!


啊,谢谢!我正在用ISO日期字符串命名一个文件,但是它包含非法字符“:”!谢谢! - Mason

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

解决方案是使用由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
这是我的问题,可能有助于其他人 - 尽管这不是发帖者的问题。
DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.ToString());

我通过将我的路径输出到日志文件中并发现它未正确格式化来确定问题所在。对我来说,正确的格式很简单:

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

2

尝试更改:

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

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


URL通常有正斜杠,而MapPath聪明到可以自行解决。 - Justin
@spender 字符串开头有一个 @,该符号用于转义字符。 - Justin

1

使用Path.Combine方法有帮助吗?这是一种更安全的连接文件路径的方式。可能是由于连接路径时出现了问题。


1
今天我遇到了同样的问题。 我试图将文件加载到我的代码中,但是这个文件在Excel中被打开进行编辑。 关闭Excel之后,代码开始正常工作!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接