“不支持给定路径的格式。”


103

我的网络服务中有以下代码:

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:/。那就是杀了我的原因。谢谢。
所有金发

Answers:


125

而不是使用str_uploadpath + fileName,而是尝试使用System.IO.Path.Combine

Path.Combine(str_uploadpath, fileName);

返回一个字符串。


现在出现错误:错误4 using namespace指令只能应用于名称空间;“System.IO.Path”是一种没有命名空间
所有的金发

2
@All Blond放在using System.IO;上面,然后清除str_uploadpath + fileName并写入Path.Combine(str_uploadpath, fileName)

代码如下所示,出现相同的错误:不支持给定路径的格式。字符串str_uploadpath = Server.MapPath(@“ / UploadBucket / Raw /”); str_uploadpath = Path.Combine(str_uploadpath,fileName); FileStream objfilestream =新的FileStream(str_uploadpath,FileMode.Create,FileAccess.ReadWrite);
所有金发

1
@All尝试调试您的代码。在导致错误的行(在Visual Studio中为F9)之前,在行的正上方放置一个断点。运行程序。当程序在断点处停止时,将鼠标悬停在变量上str_uploadpath。它的价值是什么?

1
我得到以下路径不支持的路径,为什么?“ C:\ Users \ Admin \ AppData \ Local \ Adob​​e \ Flash CS6 \ zh_CN \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf”如果将其粘贴到资源管理器中,则可以正常打开,但是。 NET的System.IO.File.ReadAllBytes方法引发该错误。这当然是有效且准确的路径,那么为什么会出错?
Triynko 2012年

51

我看到发起人发现尝试使用完整路径保存文件名时发生了错误。实际上":",在文件名中包含足以解决此错误。如果":"文件名中可能包含(例如,如果文件名中带有日期戳),请确保将其替换为其他名称。即:

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

2
这解决了我的文件名一直存在的问题。我将当前日期和时间附加到文件中,并且“:”值导致我的程序抛出引用的错误OP。
acedanger

1
这通常是通过使用Path.GetInvalidPathChars而不是发生的Path.GetInvalidFileNameChars,就像我这样。
Seph 2013年

4
谢谢!这就是为什么发布多个答案始终是一个好主意的原因。
尼克

31

对我来说,问题是肉眼看不见的"‪" 左右嵌入字符。
从Windows文件属性“安全性”选项卡复制粘贴路径后,它停留在字符串的开头(恰好在“ D”之前)。

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

因此,乍一看相同,两条线实际上是不同的。


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

防止这种麻烦的一种方法是用良性字符替换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

如果该值为文件url(例如file:// C:/),请使用Uri类将其转换为常规文件名:

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

通常,使用提供的API是最佳做法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.