C# 从文件路径获取文件名时出错

C# 从文件路径获取文件名时出错,c#,.net,C#,.net,如何从文件路径获取文件名,可以从不同的OSX或windows上载文件。 我努力实现的目标和面临的挑战如下: 我的目标是清理文件名,如果它有任何非法字符。 示例:OSX允许\和一些windows文件系统不允许的字符。alg将\替换为\ 有时一些浏览器(IE)会将整个路径作为文件名发送到我的代码中。因此,如果我在windows中从网络上传共享文件,IE将以\\\\servername\\folder\\filenmae.txt的形式发送名称 --我不能使用fileinfo或path,因为来自OS

如何从文件路径获取文件名,可以从不同的OSX或windows上载文件。
我努力实现的目标和面临的挑战如下:

  • 我的目标是清理文件名,如果它有任何非法字符。 示例:OSX允许
    \
    和一些windows文件系统不允许的字符。alg将
    \
    替换为
    \
  • 有时一些浏览器(IE)会将整个路径作为文件名发送到我的代码中。因此,如果我在windows中从网络上传共享文件,IE将以
    \\\\servername\\folder\\filenmae.txt的形式发送名称

--我不能使用fileinfo或path,因为来自OSX的文件名可能包含非法字符,例如
|
,我想您应该使用以下静态方法:


和其他人指出的

;这是行不通的。不能创建跨所有操作系统工作的文件名,甚至不能创建跨单个操作系统中所有文件系统工作的文件名。我从Windows将NTFS文件复制到ISO 9660驱动器时遇到了这个问题

不要试图“清理”文件名;这些规则太不可靠,并且在文件系统之间存在冲突。使用操作系统的API构造文件,如
System.IO.Path.GetTempFileName
System.Windows.Controls.OpenFileDialog
。如果您试图以编程方式构造文件名,请将一个您认为可以跨所有客户端文件系统使用的名称(如“MyFile”加上递增序列号或十六进制GUID)传递给API,并在文件系统异常不起作用时做好准备


如果要跨文件系统复制文件,最好存储原始文件名以显示给用户,并将其用作文件保存对话框等的默认文件名,但同样,不要编写依赖它们的程序。

感谢所有回复,特别感谢@Dour High Arch。终于想出了解决办法。使用fileInfo类,也可以使用Path完成,但尚未测试

try
{
  FileInfo fileInformation = new FileInfo(tempFileName);
  String directory = fileInformation.DirectoryName;
  if (tempFileName.StartsWith(directory))
  {
    filename = fileInformation.Name;
  }
}
catch (Exception arugmentException)
{
   if (!((arugmentException is ArgumentException) || 
     (arugmentException is NotSupportedException))) throw;
}

您无法知道
\\a\b\c.txt
是来自Windows的完整路径还是来自*nix的异常文件名。OSX中的文件名应用了哪些规则?请谷歌!,我知道:-)@DineshB我肯定是在开OSX的玩笑这似乎很难。尽管你可以尝试一个小实验。如果您在Windows和OSX之间共享文件,是否会出现相同的问题(例如,如果您的MAC上有一个奇怪的文件名,您可以通过Windows访问它)?问得好!,如果您尝试复制OSX不工作,它可能会给您一个错误,OSX中文件的示例文件名为test/\.txt,会引发异常,其次,如果文件名是路径,这在OSX中是正确的。我理解,但是,如果有人从OSX上传文件名为text/\.txt的文件,而另一个人尝试在windows上下载该怎么办。(忽略我在服务器上的存储方式)在UI中向此人显示名称“text/\.txt”。如果您试图在Windows上保存,它将抛出,您必须让用户重试或创建自己的名称。但这可能发生在用户的任何文件名上;名称是否来自其他文件系统无关紧要。好主意,但我的任务是重命名这些文件。现在有一个临时解决方案-尝试{filename=path.getFileName(filename)}catch(异常e){if(!(e是ArgumentException))throw;}filename=renameFileName(文件名);不要将
文件名
传递给
重命名文件名
;如果
fileName
抛出,您无法可靠地确定原因。相反,
renameFileName
应该使用依赖于文件系统的规则来创建新名称。@DineshB,请注意,仅由有效字符组成的文件名(例如,..)可以抛出。有效的文件名(例如“PRN”)可以抛出。