【问题标题】:"The given path's format is not supported."“不支持给定路径的格式。”
【发布时间】:2011-11-13 00:12:05
【问题描述】:

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

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的值是多少?
  • 听起来fileName 是空的。
  • 贾斯汀,你是对的。文件名中的值在名称中有 C:/。这就是杀死我的原因。谢谢。

标签: c# .net webforms upload stream


【解决方案1】:

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

Path.Combine(str_uploadpath, fileName);

返回一个字符串。

【讨论】:

  • 现在出现错误:错误 4 使用命名空间指令只能应用于命名空间; 'System.IO.Path' 是一种类型而不是命名空间
  • @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 = new FileStream(str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
  • @All 尝试调试您的代码。在导致错误的行之前的行上放置一个断点(Visual Studio 中的 F9)。运行你的程序。当程序在断点处停止时,将鼠标悬停在变量str_uploadpath 上。它的价值是什么?
  • 以下路径不支持路径,为什么? “C:\Users\Admin\AppData\Local\Adobe\Flash CS6\en_US\Configuration\CodeModel\cm-cache\SwcCache\basemovie3.swc1272273593\library.swf” 如果我将其粘贴到资源管理器中,它会打开正常,但是 . NET 的 System.IO.File.ReadAllBytes 方法会引发该错误。这当然是一条有效且准确的路径,那为什么会出错呢?
【解决方案2】:

使用Path.Combine 方法有帮助吗?这是将文件路径连接在一起的更安全的方法。可能是在将路径连接在一起时遇到问题

【讨论】:

    【解决方案3】:

    尝试改变:

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

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

    【讨论】:

    • 网址通常有正斜杠,MapPath 足够聪明,可以找出任何一种方式。
    • @spender 在字符串的前面有一个@,它可以避开那些。
    【解决方案4】:

    我看到创建者在尝试使用完整路径保存文件名时发现错误。实际上,在文件名中有一个":" 就足以得到这个错误。如果您的文件名中可能有":"(例如,如果您的文件名中有日期戳),请确保将它们替换为其他内容。即:

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

    【讨论】:

    • 这解决了我的文件名问题。我将当前日期和时间附加到我的文件中,并且“:”值导致我的程序抛出错误 OP 引用。
    • 这经常发生在使用Path.GetInvalidPathChars 而不是Path.GetInvalidFileNameChars 时,我就是这样。
    • 谢谢!这就是为什么发布多个答案总是一个好主意。
    【解决方案5】:

    如果您在 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
    

    【讨论】:

      【解决方案6】:

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

      您不能在完整的 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 日期字符串的文件,但其中包含非法的“:”!谢谢!
      【解决方案7】:

      如果您尝试将文件保存到文件系统。 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()));
      【解决方案8】:

      这是我的问题,可能对其他人有所帮助——尽管这不是 OP 的问题:

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

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

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

      【讨论】:

        【解决方案9】:

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

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

        一般来说,使用提供的 API 是最佳做法。

        【讨论】:

          【解决方案10】:

          我正在使用(有限的)表达式生成器来创建一个变量,以便在简单的文件系统任务中使用,以便在 SSIS 中创建文件存档。

          这是我删除冒号以阻止错误的快速而肮脏的技巧: @[User::LocalFile] + "-" + REPLACE((DT_STR, 30, 1252) GETDATE(), ":", "-") + ".xml"

          【讨论】:

            【解决方案11】:

            对我来说,问题是人眼看不见 "‪" Left-To-Right Embedding 字符。
            在我从 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
            • 哈!在这里,我认为该对话框很有帮助...让我复制文件的完整路径...谢谢!
            • 谢谢。我花了很长时间才找到这个。
            【解决方案12】:

            我今天遇到了同样的问题。 我试图加载到我的代码中的文件已打开以在 Excel 中进行编辑。 关闭Excel后,代码开始工作!

            【讨论】:

              【解决方案13】:
              Image img = Image.FromFile(System.IO.Path.GetFullPath("C:\\ File Address"));
              

              您需要按指定类获取完整路径。我有同样的错误并修复...

              【讨论】:

                猜你喜欢
                • 2012-04-21
                • 1970-01-01
                • 2017-09-14
                • 2014-12-08
                • 1970-01-01
                • 1970-01-01
                • 2012-05-15
                • 2017-06-26
                相关资源
                最近更新 更多